스트림 (Streams)¶
적절한 경우 스트림을 사용하고 "간단한" 사용법을 고수하십시오. 값을 나타내는 유형에 대해서만 스트리밍하기 위해 <<를 오버로드하고 구현 세부 정보가 아닌 사용자에게 표시되는 값만 작성합니다.
스트림은 표준 헤더
<< 및 >> 스트림 연산자는 쉽게 학습되고 이식 가능하며 재사용 및 확장 가능한 형식화된 I/O용 API를 제공합니다. 대조적으로 printf는 사용자 정의 유형은 말할 것도 없고 std::string도 지원하지 않으며 이식적으로 사용하기가 매우 어렵습니다. printf는 또한 해당 함수의 약간 다른 여러 버전 중에서 선택하고 수십 개의 변환 지정자를 탐색하도록 요구합니다.
스트림은 std::cin , std::cout , std::cerr 및 std::clog 를 통해 콘솔 I/O에 대한 최고 수준의 지원을 제공합니다. C API도 마찬가지지만 입력을 수동으로 버퍼링해야 하기 때문에 방해를 받습니다.
- 스트림 상태를 변경하여 스트림 형식을 구성할 수 있습니다. 이러한 변형은 지속적이므로 다른 코드가 스트림을 건드릴 때마다 이를 알려진 상태로 복원하기 위해 노력하지 않는 한 코드의 동작은 스트림의 전체 이전 기록에 의해 영향을 받을 수 있습니다. 사용자 코드는 내장된 상태를 수정할 수 있을 뿐만 아니라 등록 시스템을 통해 새로운 상태 변수와 동작을 추가할 수도 있습니다.
- 위의 문제, 스트리밍 코드에서 코드와 데이터가 혼합되는 방식, 연산자 오버로딩(예상과 다른 오버로드를 선택할 수 있음) 사용으로 인해 스트림 출력을 정확하게 제어하기가 어렵습니다.
- << 연산자 체인을 통해 출력을 구축하는 관행은 코드에 단어 순서를 적용하고 스트림의 지역화 지원에 결함이 있기 때문에 국제화를 방해합니다.
- 스트림 API는 미묘하고 복잡하므로 프로그래머는 이를 효과적으로 사용하기 위해 경험을 쌓아야 합니다.
- <<의 많은 오버로드를 해결하는 것은 컴파일러에게 엄청난 비용이 듭니다. 대규모 코드베이스에서 광범위하게 사용될 경우 구문 분석 및 의미 분석 시간의 최대 20%를 소비할 수 있습니다.
작업에 가장 적합한 도구인 경우에만 스트림을 사용하십시오. 이는 일반적으로 I/O가 임시적이고 로컬이며 사람이 읽을 수 있고 최종 사용자가 아닌 다른 개발자를 대상으로 하는 경우입니다. 주변 코드 및 코드베이스 전체와 일관성을 유지하십시오. 문제에 대해 확립된 도구가 있으면 대신 해당 도구를 사용하십시오. 특히, 로깅 라이브러리는 일반적으로 진단 출력을 위한 std::cerr 또는 std::clog보다 더 나은 선택이며, absl/strings 또는 이에 상응하는 라이브러리는 일반적으로 std::stringstream보다 더 나은 선택입니다.
외부 사용자를 상대하거나 신뢰할 수 없는 데이터를 처리하는 I/O에는 스트림을 사용하지 마세요. 대신, 국제화, 지역화, 보안 강화와 같은 문제를 처리하는 데 적합한 템플릿 라이브러리를 찾아서 사용하세요.
스트림을 사용하는 경우 imbue() , xalloc() 및 Register_callback() 과 같은 스트림 API의 상태 저장 부분(오류 상태 제외)을 피하세요. 숫자 기반, 정밀도 또는 패딩과 같은 형식 지정 세부 사항을 제어하려면 스트림 조작기나 형식 지정 플래그 대신 명시적 형식 지정 함수(예: absl::StreamFormat() )를 사용하십시오.
유형이 값을 나타내는 경우에만 유형에 대한 스트리밍 연산자로 <<를 오버로드하고 <<는 해당 값에 대해 사람이 읽을 수 있는 문자열 표현을 작성합니다. << 출력에 구현 세부 정보가 노출되지 않도록 하세요. 디버깅을 위해 객체 내부를 인쇄해야 하는 경우 대신 명명된 함수를 사용하십시오(DebugString()이라는 메서드가 가장 일반적인 규칙입니다).
이해하기 쉽게 설명하기¶
핵심: 적절할 때만, "간단하게" 쓰기¶
스트림(<iostream>)은 C++ 표준 I/O 추상화로, 주로 디버그 로깅·테스트 진단에 씁니다. 쓰더라도 단순한 사용에 머무르세요.
언제 쓰나 / 쓰지 않나¶
- 써도 됨: I/O가 임시적·지역적이고 사람이 읽을 용도이며, 대상이 최종 사용자가 아닌 개발자일 때.
- 쓰지 말 것: 외부 사용자 대상이거나 신뢰할 수 없는 데이터를 다루는 I/O. (국제화·보안을 처리하는 템플릿 라이브러리를 쓰세요.)
- 이미 확립된 도구가 있으면 그것을 쓰세요: 진단 출력엔 로깅 라이브러리(>
std::cerr/std::clog), 문자열 조립엔absl/strings(>std::stringstream).
주의¶
imbue(),xalloc(),register_callback()같은 상태 저장(stateful) API는 피하세요(오류 상태 제외). 형식 지정은 스트림 조작자 대신 명시적 함수(absl::StreamFormat()등)로.<<는 값을 나타내는 타입에만, 사람이 읽을 표현을 쓰도록 오버로드하세요. 구현 세부사항을 노출하지 마세요. 디버깅용 내부 출력은DebugString()같은 명명된 함수로.