[C++] iostream
REF : cplusplus
iostream 헤더를 까봅시다.
iostream 헤더가 각각 ostream, istream 헤더를 include해서 사용하고 있는 것을 볼 수 있습니다.
그리고 extern을 통해 istream, ostream 객체를 std namespace안의 cin, cout등의 전역변수로 선언하고 있음을 알 수 있습니다.
iostream 헤더는 아래와 같이 선언되어있고,
그리고 ios 헤더를 보면, 아래와 같이 선언되어있습니다.
그리고 iosfwd 헤더를 보면,
basic_istream, basic_ostream이 각각 istream, ostream으로 typedef가 적용되어 있는것을 볼 수 있습니다.
cplusplus의 istream 설명을 보면, 위 헤더들의 관계를 쉽게 정리할 수 있는데,
이와 같습니다.
결국, iostream이라는 헤더는 istream
, ostream
헤더에서 정의한 basic_istream
, basic_ostream
객체를
iosfwd
헤더를 통해 typedef로 변환된 istream
ostream
객체를
cin, cout 등의 전역변수로 내뱉는 역할밖에 하지 않습니다.
즉, istream, ostream 클래스를 상속하는 클래스이므로, 입출력 작업을 모두 할 수 있습니다.
iostream 클래스는 streambuf라는 객체를 사용하게되는데,
stream buf는 입출력 스트림 객체(basic_istream, basic_ostream)가 읽기 및 쓰기 작업을 수행하는 객체입니다.
각 입출력 스트림 객체는 이런 작업을 stream buffer object에 권한을 위임 작업을 처리하고,
stream buffer는 각 입출력 스트림 객체와 작업을 잇는 매개체가됩니다.
그리고 streambuf는 2가지 객체를 가지고 있는데,
streambuf와 filebuf입니다.
각 객체는 streambuf를 상속합니다.
stream buf에는 protected 멤버변수로 버퍼의 시작부분, 끝부분을 나타내는 변수를 가지고 있습니다.
C++의 std::cin과 C의 stdin은 기본적으로 공유되고 있는데,
위의 사진에서 주석을 보면 멤버변수들이 _IO_FILE을 기반으로한다는 것을 알 수 있습니다.
_IO_FILE 구조체를 살펴보면
C++의 streambuf 프로토콜과 상응하는 포인터들이 정의되고 있는것을 볼 수 있습니다.
댓글남기기