(전체가 아니라 C#과 차이가 있는 부분을 중심으로 요약 정리)

스트림 사용법

스트림의 정체

1장에서 cout 스트림을 소개할 때 공장의 컨베이어 벨트에 비유했다. 스트림에 변수를 올려 보내면 사용자의 화면인 콘솔에 표시된다. 이를 일반화해서 모든 종류의 스트림을 컨베이어 벨트로 표현할 수 있다.

스트림마다 방향과 소스(source) 또는 목적지(destination)을 지정할 수 있다. 예컨대 앞 장에서 본 cout 스트림은 출력 스트림이다. 그래서 나가는(out) 방향을 갖는다. cout은 데이터를 콘솔에 쓴다. 따라서 목적지는 ‘콘솔’이다. cout의 c는 console이 아니라 character를 의미한다. 즉, cout은 문자 기반 스트림이다. 이와 반대로 사용자의 입력을 받는 cin이란 스트림도 있다.

C++에서 기본으로 정의된 스트림을 간략히 정리하면 다음과 같다.

제목 없음

여기서 버퍼를 사용하는 (buffered) 스트림은 받은 데이터를 버퍼에 저장했다가 블록 단위로 목적지를 보내고, 버퍼를 사용하지 않는 (unbuffered) 스트림은 데이터가 들어오자마자 목적지로 보낸다. 이렇게 버퍼에 잠시 저장(버퍼링, buffering) 하는 이유는 파일과 같은 대상에 입출력을 수행할 때는 블록 단위로 묶어서 보내는 것이 효율적이기 때문이다. 참고로 버퍼를 사용하는 스트림은 버퍼를 깨끗이 비우는 flush() 메서드로 현재 버퍼에 담긴 데이터를 목적지로 보낸다.

스트림에서 중요한 또 다른 사실은 데이터가 현재 가리키는 위치와 함께 담겨 있다는 것이다. 스트림에서 현재 위치란 다음번에 읽기 또는 쓰기 연산을 수행할 위치를 의미한다.

스트림의 출발지와 목적지

스트림이란 개념은 데이터를 입력 받거나 출력하는 객체라면 어떤 것에도 적용할 수 있다. 네트워크 관련 클래스를 스트림 기반으로 작성할 수도 있고, MIDI 장치에 접근하는 부분도 스트림으로 구현할 수 있다.

파일 스트림(file stream)은 파일 시스템에서 데이터를 읽고 쓰는 스트림이다. 스트링 스트림(string stream)은 스트링 타입에 스트림 개념을 적용한 것이다.

스트림을 이용한 출력

출력 스트림의 기초

출력 스트림은 <ostream> 헤더 파일에 정의돼 있다. 출력 스트림을 사용하는 가장 간편한 방법은 << 연산자를 이용하는 것이다.

(앞서 많이 다루었기 때문에 이하 cout에 대한 예시 생략)

출력 스트림에서 제공하는 메서드

출력 스트림에서 가장 대표적인 연산자는 << 다. 이 연산자는 단순히 출력하는 기능 외에도 여러 기능을 제공한다.

put()과 write()

put()과 write()는 저수준 출력 메서드에 속하며 출력 동작을 갖춘 객체나 변수가 아닌 문자 하나 (put()) 또는 문자 배열 하나 (write())을 인수로 받는다.