C++ 스트림 마스터: cout, cin, cerr, clog 실전 가이드
C++에서 스트림이란?
C++은 바이트 시퀀스로 데이터를 전송하는 스트림 클래스 패밀리를 통해 입출력을 추상화합니다. 이 스트림들은 언어에서 모든 I/O 연산의 중추입니다.
스트림은 두 범주로 나뉩니다:
스트림 타입
- 입력 스트림 – 키보드나 파일 같은 장치에서 데이터를 받아 메모리에 배치
- 출력 스트림 – 메모리에서 모니터나 파일 같은 장치로 데이터 전송
이 튜토리얼에서 다룰 내용:
- 스트림 기초
- 스트림 내부 동작 원리
- 핵심 스트림 클래스와 기능들
- C++ I/O 헤더 파일들
- std::cout, std::cin, std::cerr, std::clog 사용법
- 스트림 객체를 이용한 에러 처리
스트림 작동 방식
C++ 스트림 연산의 일반적인 흐름:
- 적절한 타입의 스트림 객체 인스턴스화
- get/put 포인터를 사용하여 스트림을 장치나 파일과 연관
- 추출(
>>) 또는 삽입(<<) 연산자로 I/O 수행
스트림 함수 개요
streambuf 헤더는 파일 버퍼를 관리하는 여러 클래스를 제공합니다:
| 클래스 | 설명 |
| filebuf | 읽기/쓰기용 파일 버퍼 관리. open()과 close() 제공 |
| fstreambase | ifstream, fstream, ofstream의 베이스 – 공통 파일 스트림 연산 |
| ifstream | 데이터 읽기용 입력 파일 스트림 |
| ofstream | 데이터 쓰기용 출력 파일 스트림 |
| fstream | 결합 입출력 스트림 |
C++ I/O 헤더 파일
- iostream –
cin, cout, cerr, clog 제공
- iomanip –
setw, setprecision 같은 조작자 제공
- fstream – 파일 기반 스트림 처리
이 모든 객체는 iostream에 정의되어 있으며, 헤더 생략 시 컴파일 오류 발생.
std::cout
cout 객체는 표준 출력 스트림(보통 콘솔)에 씁니다. 삽입 연산자(<<)와 함께 사용.
예제
#include <iostream>
using namespace std;
int main() {
char welcome[] = "Welcome to Guru99";
cout << welcome << endl;
return 0;
}
출력:

코드 분석:
iostream 포함으로 cout 접근
- 접두사 방지를 위해
std 네임스페이스 사용
- 메시지를 담은 문자 배열 정의
endl로 줄바꿈 삽입하며 메시지 출력
- 성공 표시로
0 반환
std::cin
cin 객체는 표준 입력 스트림(보통 키보드)에서 읽습니다. 추출 연산자(>>)와 쌍을 이룹니다.
예제
#include <iostream>
using namespace std;
int main() {
int number;
cout << "Enter a number:";
cin >> number;
cout << "\nYou entered: " << number;
return 0;
}
출력:

코드 설명:
cin과 cout용 iostream 포함
std 네임스페이스 사용
- 정수 변수 선언
- 사용자 프롬프트
>>로 입력 읽기
- 입력된 값 에코
- 성공 시
0 반환
std::cerr
cerr 스트림은 비버퍼링되어 에러 메시지를 즉시 출력합니다. 즉시 표시되어야 하는 치명적 에러에 사용하세요.
예제
#include <iostream>
using namespace std;
int main() {
cerr << "An Error occurred!";
return 0;
}
출력:

설명:
cerr용 iostream 포함
std 네임스페이스 사용
- 에러 메시지 즉시 출력
0 반환
std::clog
cerr와 달리 clog는 버퍼링되어 버퍼가 플러시될 때까지 메시지를 저장합니다. 지연 가능한 로깅에 유용합니다.
예제
#include <iostream>
using namespace std;
int main() {
clog << "An Error occurred!";
return 0;
}
출력:

설명:
clog용 iostream 포함
std 네임스페이스 사용
- 버퍼링된 에러 메시지 작성
0 반환
스트림 객체를 이용한 에러 처리
스트림은 불리언 문맥에서 평가되어 유효성 확인 가능. 또한 멤버 함수로 세밀한 상태 확인 제공:
good() – 오류 없으면 true
bad() – 치명적 에러 설정 시 true
fail() – 실패한 연산 후 true
eof() – 스트림 끝에 도달하면 true
파일 열기 검증 예제:
ifstream file("myfile.txt");
if (!file) {
cout << "File NOT opened!" << endl;
}
사용자 입력 검증 예제:
int p;
if (cin >> p) {
cout << "Enter valid number" << endl;
}
요약
- C++에서 I/O는 바이트 시퀀스를 전송하는 스트림을 통해 수행
- 입력 스트림은 장치에서 메모리로, 출력 스트림은 메모리에서 장치로 데이터 이동
cin (istream)은 키보드 입력 읽기
cout (ostream)은 콘솔에 쓰기
cerr (ostream)은 즉시 에러 메시지 표시
clog (ostream)은 에러 출력을 버퍼링하여 나중에 플러시
- 버퍼링된 스트림은
good(), bad(), fail(), eof()로 확인 가능