스트림 (Stream)
Stream 은 사전적 의미로 줄기, 흐름, 연속적 등을 의미하고, 컴퓨터 공학에서는 어떠한 연속적인 데이터의 흐름 경로를 말합니다.
쉽게 비유하면, '화폐 교환' 표현을 사용할 수 있습니다.
- 한국에서는 원화를, 일본에서는 엔화를 사용합니다. 그리고 두 국가의 화폐 교환을 기축통화 달러화로 정합니다.
- 한국에서 일본으로 돈을 보낼때는 원화 -> 달러화 -> 엔화 순서를 거칩니다.
- 일본에서 한국으로 돈을 보낼때는 엔화 -> 달러화 -> 원화 순서를 거칩니다.
"달러화 교환" 이라는 Stream 경로를 통해 두 국가의 화폐는 교환될 수 있습니다.
스트림은 데이터의 독립성을 보장합니다.
원본 데이터가 어떠한 형태로 저장되어 있는지 모르더라도, 프로그래머들 사이에서 약속한 스트림 규격에 따라 데이터를 주고 받으면, 각 데이터는 호환된다고 말할 수 있습니다.
- 물리적 장비와 데이터 사이의 관계 뿐 아니라, 데이터와 데이터 사이의 관계 등에도 폭 넓게 사용됩니다.
C++에서의 표준 입출력
C++ 에서의 표준 입출력은 스트림 개념에 의해 정의됩니다.
입력 istream, 출력 ostream, 입출력 iostream 등 다소 복잡한 상속관계에 의해 정의되지만, 여기서는 표준입출력 방법에 대해서만 소개합니다.
#include <iostream>
int main(int argc, char** argv)
{
// 출력 폭
std::cout.width(20);
std::cout << "Hello" << " World" << std::endl;
// 채우기
std::cout.width(20);
std::cout.fill('*');
std::cout << "Hello" << " World" << std::endl;
std::cout.fill(' ');
// 정렬 지정
std::cout.width(20);
std::cout << std::left << "Hello World" << std::endl;
std::cout.width(20);
std::cout << std::internal << "Hello World" << std::endl;
std::cout.width(20);
std::cout << std::right << "Hello World" << std::endl;
std::cout << std::hex << 1024 << std::endl; // 16진수
std::cout << std::oct << 1024 << std::endl; // 8진수
// 실수 정밀도
std::cout << 0.12345678f << std::endl;
std::cout.precision(3);
std::cout << 0.12345678f << std::endl;
std::cout.precision(10);
std::cout << 0.12345678f << std::endl;
return 0;
}
Hello World
Hello World
Hello World
Hello World
Hello World
400
2000
0.123457
0.123
0.1234567836
std 네임스페이스의 cout 은 출력에 관한 표준 입출력 객체입니다.
- <<연산자가 직관적으로 오버로딩 되어 있으며, 데이터를 왼쪽으로 (cout 방향으로) 보낸다는 의미를 담습니다.
- 주의하실 부분은, width 메소드는 다음 출력 1회에 한해서만 적용됩니다.
#include <iostream>
#include <string>
int main(int argc, char\*\* argv)
{
int number;
char str\[256\];
std::string strClass;
std::cin >> number;
std::cout << number << std::endl;
std::cin >> str;
std::cout << str << std::endl;
std::cin >> strClass;
std::cout << strClass << std::endl;
}
입력 데이터 :
4 Hello Hello
출력 데이터 :
4
Hello
Hello
std 네임스페이스의 cin 은 입력에 관한 표준 입출력 객체입니다.
- 이 클래스는 띄어쓰기를 기준으로 데이터를 받습니다.
- 띄어쓰기는 문자열을 토큰으로 나눌때 쓰는 가장 대표적 방법중 하나이며, 공백문자를 받기 위해서는 별도의 방법을 사용해야 합니다.
만약 읽어들이지 못하는 무효의 경우가 발생한 경우 해당 위치에서 입력이 중단됩니다.
- 처리 못한 입력데이터가 버퍼에 남아 있을 경우 다음 std::cin 에서 처리됩니다.
- 의도하지 않는 경우라면, 버퍼를 별도로 비워줘야 합니다.
cin 의 clear 메소드는 버퍼를 비워주는 메소드가 아닙니다.
- fflush(stdin); 같은 C 스타일의 코드로 비우거나 cin 클래스의 다른 메소드들을 조합하여 비워야 합니다.