모두의 코드
C++ IOstream (입출력) 라이브러리

  이 레퍼런스의 모든 내용은 http://www.cplusplus.com/reference/iostream/ 의 내용을 기초로 하여, Microsoft 의 MSDN 과 Bjarne Stroustrup 의 책 <<The C++ Programming Language>> 를 참고로 하여 만들어졌습니다. 이는 또한 저의 개인적인 C++ 능력 향상과 저의 모토인 '지식전파' 를 위해 모든 이들에게 공개하도록 하겠습니다.

iostream 라이브러리의 전체 개요도. 참고로 모두 char 형으로 특수화 된 것들이다. 사실은 모두 템플릿으로, 예컨대 basic_ios<>, basic_iostream<>, basic_streambuf<> 등이다.

iostream 라이브러리는 객체지향 라이브러리로, 스트림을 이용하여 입출력 기능을 제공한다.

스트림이란, 여러 장치에 입출력 작업이 실행되는 것을 '추상화' 하여 나타낸 것이다. 보통 스트림은 디스크나 키보드, 혹은 콘솔과 같이 문자들을 이러한 장치들로 부터 주고받을 때 사용된다. 따라서 사용자는 어떤 장치들에 입출력 연산을 하냐에 무관하게, 스트림을 통해 편리하게 입출력을 사용할 수 있게 된다.

예컨대, 파일 스트림은 C++ 객체로 파일들을 수정하고, 여러가지 상호작용할 수 있도록 만들어진 것이다. 또한, 파일 스트림을 디스크의 특정 파일과 연관시켰다면, 파일 스트림에 단순히 작업하므로써 사용자는 실제 디스크의 파일에 물리적 작업(쓰거나 읽거나 등등) 을 할 수 있게 된다.

스트림과 작업하기 위해서는 C++ 은 아래와 같은 표준 입출력 라이브러리 (standard iostream library) 를 지원하여, 아래와 같은 것들을 가지고 있다. (참고적으로 C 의 경우 C 표준 입출력 라이브러리 (stdio) 를 지원하며 C++ 에서 역시 사용 가능한데, 이 경우 cstdio.h 를 참조하면 된다)

iostream 라이브러리는 무엇으로 구성되어 있나?

기초적인 클래스 템플릿들 (Basic class templates)

입출력 라이브러리는 클래스 템플릿들의 상속 관계로 이루어져 있다. 이러한 클래스 템플릿들은 라이브러리를 타입에 영향을 받지 않게 독립적(type-independent)으로 만들어주게 된다. 이들은 클래스 템플릿의 집합으로, 각각은 2 개의 템플릿 인자를 가지고 있다. 하나는 char 로(charT) 입출력될 데이터들을 어떠한 문자로 조작(manipulate) 할 지 결정하고 (예컨대 char, wchar_t 등등), 다른 하나는 trait 인자로, 입출력될 데이터 처리시 부가적인 성질을 부여하게 된다.

이 클래스 템플릿들로 부터 char 형으로 특수화 된 클래스들 (즉 char_traitschar 이 전달된 경우) 은 템플릿 이름 앞에 붙은 basic_ 을 뺀 이름을 가지고 있다. 예컨대 istreambasic_istream 으로 부터 char 형으로 특수화 된 클래스 이다. 또한 fstreambasic_fstream 으로 부터 특수화 된 것이다. 유일한 예외는 ios_base인데, 이는 그 자체로 타입에 무관하기 대문에 템플릿을 기반으로 하지 않지만 어쨋든 클래스 이다.

클래스 템플릿 특수화

이 라이브러리에는 기본적으로 iostream 클래스 템플릿에서 두 가지 형태로 특수화 된 클래스 들이 존재한다. 하나는 위에서도 말했지만 char 형태로 데이터들을 조작하는 것이고 다른 하나는 wchar_t 형태로 데이터를 조작하는 클래스들이다.

char 형으로 특수화 된 클래스들이 위 사진에서도 잘 나와있듯이 iostream 라이브러리에서는 더 잘 알려진 형태이다. 이들을 보통 narrow-oriented 되었다고 부르는데, ios, istream, ofstream 과 같은 경우이다. 반대로 wchar_t 형태로 특수화 된 경우(wide-oriented 되었다고 부른다), 클래스 이름 앞에 w 가 붙게 되는데, 예컨대 wios, wistream, wofstream 등이 있다.

표준 객체(standard object)

iostream 라이브러리의 일부로, 해더파일 <iostream> 에서는 표준 입력과 출력에 입출력 작업을 실행할 객체들이 정의되어 있다. narrow-oriented 객체들의 경우 우리에게 친숙한 cin, cout, cerr, clog 가 정의되어 있고, wide-oriented 객체들의 경우 wcin, wcout, wcerr, wclog 들이 있다.

타입

iostream 클래스들은 trait 를 기반으로 한 타입과 이들을 특수화 한 타입들을 주로 사용한다.

조작자(Manipulator)

조작자들은 전역 함수들로, iostream 스트림 객체에 삽입(insertion, <<) 과 추출(extraction, >>) 작업과 함께 사용되는 것들이다. 이들은 스트림의 성질이나, 설정된 서식등을 바꾼다. 예를 들어 endl, hex, scientific 등을 들 수 있다.

전체의 대략적 구성

라이브러리와 이들와 관계로 분류하였다.

참고사항

이 레퍼런스에 수록된 이름들과 원형들, 그리고 예시들은 모두 클래스 템플릿 그 자체 보다는 char 형으로 특수화 된 경우이다. 물론 클래스 템플릿들이 다른 타입으로 특수화 될 수 있지만 이렇게 char 형으로 특수화 된 경우를 수록한 것이 보기에 더 편하고, 원래 템플릿 이름을 알아내는데 훨씬 용이하므로 이 형태로 나타내었다.

표준 입출력 라이브러리(iostream) 의 구성 요소들

클래스

객체

타입

조작자(Manipulator) - 모두 함수이다.

프로필 사진 없음
댓글에 글쓴이에게 큰 힘이 됩니다