C++ 표준 입출력 스트림이란?
cin, cout, cerr, clog는 표준 입력(standard input)과 표준 출력(standard output)을 담당하는 스트림입니다. 이 네 가지 스트림 객체는 모두 iostream 헤더 파일에 정의되어 있으며, C++ 프로그램에서 콘솔 입출력을 처리할 때 반드시 알아야 할 핵심 요소입니다.
std::cin — 표준 입력 스트림
std::cin은 istream 클래스의 객체로, 좁은 문자(narrow character, char 타입)를 다루는 표준 입력 스트림을 나타냅니다. C 언어의 stdin 스트림에 해당하며, 표준 입력 스트림은 실행 환경에 의해 결정되는 문자 입력원입니다. 일반적으로 키보드나 파일 같은 외부 소스로부터의 입력이라고 가정합니다.
std::cout — 표준 출력 스트림
std::cout은 ostream 클래스의 객체로, 좁은 문자(char 타입)를 위한 표준 출력 스트림을 나타냅니다. C 언어의 stdout 스트림에 해당하며, 환경에 의해 결정된 기본 출력 대상입니다. 이 출력 대상은 cerr나 clog 같은 다른 표준 객체와 공유될 수도 있습니다.
cerr — 표준 에러 출력 스트림
cerr 객체는 <cstdio> 헤더에 선언된 stderr와 연결된 스트림 버퍼로 출력을 제어합니다. 주로 오류 메시지를 표준 출력 스트림으로 내보낼 때 사용되며, 버퍼링 없이 즉시 출력된다는 특징이 있어 디버깅 시 유용합니다.
주요 특징: 초기화와 소멸 시점
이 헤더에 선언된 모든 객체들은 특별한 속성을 공유합니다. <iostream>을 포함하는 번역 단위(translation unit)에서 정의한 어떤 정적(static) 객체보다도 먼저 생성된다고 가정할 수 있으며, 마찬가지로 사용자가 정의한 정적 객체들의 소멸자가 호출되기 전까지 소멸되지 않는다고 가정할 수 있습니다.
다만 출력 스트림들은 프로그램 종료 과정에서 플러시(flush)됩니다. 따라서 프로그램 시작 전과 종료 후에도 표준 스트림으로부터 안전하게 읽거나 쓸 수 있습니다.
사용 예제
다음은 세 가지 스트림 객체를 실제로 활용하는 간단한 예제입니다.
#include<iostream>
int main() {
int my_int;
std::cin >> my_int; // 표준 입력으로 정수 받기
std::cout << my_int; // 표준 출력으로 값 출력
std::cerr << "An error message"; // 표준 에러로 메시지 출력
return 0;
}
컴파일 및 실행 방법
위 프로그램을 hello.cpp 파일로 저장한 뒤, 터미널(cmd)에서 파일이 저장된 위치로 이동하여 아래 명령어로 컴파일합니다.
$ g++ hello.cpp
그다음 아래 명령어로 프로그램을 실행합니다.
$ ./a.out
실행 결과
입력값으로 15를 입력하면 다음과 같은 결과가 출력됩니다.
15 An error message
이처럼 cin은 데이터 입력, cout은 일반 출력, cerr는 오류 메시지 출력을 각각 담당하며, 목적에 맞게 구분하여 사용하면 더욱 체계적인 C++ 프로그램을 작성할 수 있습니다.