Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++ cerr과 cout의 차이점: stdout·stderr 스트림 완벽 이해

C++에서 cerr과 cout의 차이점

C++에서 cout은 표준 출력(stdout) 스트림의 객체이고, cerr는 표준 오류(stderr) 스트림의 객체입니다. 두 객체 모두 <iostream> 헤더에 정의되어 있으며, 기본적으로 콘솔 화면에 출력된다는 공통점이 있지만 성격과 용도가 서로 다릅니다.

1. 서로 다른 독립적인 스트림

stdout과 stderr는 기본적으로 모두 콘솔에 출력되기 때문에 같은 것처럼 보이지만, 실제로는 별개의 독립적인 스트림입니다. 따라서 둘 중 하나를 리디렉션하거나 파이프로 연결하더라도(예: program.exe > out.txt) 다른 하나에는 전혀 영향을 주지 않습니다.

2. 버퍼링 방식의 차이

cout은 버퍼링(buffered) 스트림으로, 출력 내용이 버퍼에 임시로 저장되었다가 버퍼가 가득 차거나 명시적으로 비워질 때 한꺼번에 출력됩니다. 반면 cerr는 버퍼링되지 않는(unbuffered) 스트림으로, 호출 즉시 곧바로 출력됩니다. 덕분에 프로그램이 예기치 않게 비정상 종료되는 상황에서도 오류 메시지가 화면에 확실히 남게 됩니다.

3. 올바른 사용 용도

일반적으로 다음과 같이 구분하여 사용하는 것이 좋습니다.

  • stdout(cout): 프로그램의 실제 결과물, 데이터 등 정상적인 출력
  • stderr(cerr): 오류 메시지, 경고, 진단 정보 등 부가적인 메시지

이렇게 분리하면 사용자가 출력을 파일로 리디렉션하더라도 오류나 정보 메시지는 여전히 화면에 표시되고, 출력 파일에는 프로그램의 순수한 결과값만 깔끔하게 저장됩니다.

간단한 사용 예제

#include <iostream>

int main() {
    std::cout << "정상적인 프로그램 출력" << std::endl;
    std::cerr << "오류 발생! 입력값을 확인하세요." << std::endl;
    return 0;
}

정리

coutcerr는 각각 stdout과 stderr라는 서로 다른 스트림에 연결되어 있습니다. 리디렉션이 서로에게 영향을 주지 않으며, 버퍼링 유무와 용도에서도 차이가 있습니다. 정상 출력은 cout으로, 오류 및 진단 메시지는 cerr로 출력하는 습관을 들이면 더 견고하고 관리하기 쉬운 프로그램을 작성할 수 있습니다.