iostream
_EXPORT_STD extern "C++" __PURE_APPDOMAIN_GLOBAL _CRTDATA2_IMPORT istream cin;
_EXPORT_STD extern "C++" __PURE_APPDOMAIN_GLOBAL _CRTDATA2_IMPORT ostream cout;
_EXPORT_STD extern "C++" __PURE_APPDOMAIN_GLOBAL _CRTDATA2_IMPORT ostream cerr;
_EXPORT_STD extern "C++" __PURE_APPDOMAIN_GLOBAL _CRTDATA2_IMPORT ostream clog;
iostream header file은 표준 입출력 class를 정의하고 있다. c++은 OOP로 모든 것이 객체로 이루어져있다. iostream 또한 객체를 통해 데이터 입출력을 시행한다. 이때 stream을 이용하여 입출력을 제공한다. stream은 buffer를 가지고 있으며, buffer에 data를 임시 저장한 후에 전달한다.
cout
std::cout << data << data2 << endl;
template<class CharT, class Traits>
basic_ostream<CharT, Traits>&operator<<(basic_ostream<CharT, Traits>& os, CharT ch);
cout은 ostream이라는 출력 스트림을 사용한다. cout 이후에 나오는 '<<' 연산자는 스트림 추출 연산이다. stream 객체로부터 데이터를 읽어 출력한다. '<<' 연산자는 출력 스트림에 data를 입력 후, 출력 스트림에 대한 참조를 반환한다.
위의 사례에서 'cout << data' 에 대한 연산이 먼저 시행된다. 이때 cout의 버퍼에 data가 입력되고 cout에 대한 참조를 반환한다. 다음 남은 cout << data2를 수행하여 data가 입력된 버퍼에 data2를 추가한 후 cout에 대한 참조를 반환한다.
이때 출력 스트림에 대한 참조가 아닌 출력 스트림을 반환할 경우, 출력 스트림의 복사값을 출력하게 된다. 이에 따라 연산자 중복 시에 원하는 출력값이 나오지 않을 수 있다.
cin
std::cin >> data >> data2 >> endl;
template<class CharT, class Traits>
basic_istream<CharT, Traits>&operator>>(basic_istream<CharT, Traits>& st, CharT& ch);
cin은 istream이라는 입력 스트림을 사용한다. cin 이후에 나오는 '>>' 연산자는 스트림 추출 연산이다. stream 객체로부터 데이터를 읽어 입력한다. '>>' 연산자는 입력 스트림에 data를 입력 후, 입력 스트림에 대한 참조를 반환한다.
위의 사례에서 'c >> data' 에 대한 연산이 먼저 시행된다. 이때 cin의 버퍼에 data가 입력되고 cin에 대한 참조를 반환한다. 다음 남은 cin >> data2를 수행하여 data가 입력된 버퍼에 data2를 추가한 후 cin에 대한 참조를 반환한다.
clog
std::clog << error;
clog는 출력 스트림을 사용하는 출력 객체라는 점에서 cout과 유사하다. clog는 debugging 용도로 사용된다.
cerr
std::cerr << error;
cerr은 unbuffered 출력 스트림을 사용한다. 여기서 unbuffered는 buffer에 저장하지 않고 즉시 출력값을 내보낸다는 뜻이다. 위에서 나왔던 cout, clog의 buffered 형식의 스트림은 원하는 시점에 정상적인 출력이 발생하지 않을 수 있다. 반면 cerr의 경우, 버퍼를 거치치 않고 출력이 가능하다.
Traits
위의 예제 코드에서 나오는 Trait에 대해서 설명한다. Traits class는 문자열의 형태와 관리 방법을 정의한다. 주로 '\0'문자를 사용한다.