C++ - cout, endl, operator<<

뭉크의 개발·2024년 2월 5일

C++

목록 보기
2/3

cout

  • cout는 표준 출력 스트림으로, 프로그램의 실행 도중 표준 출력(콘솔)에 데이터를 출력하기 위해 사용된다.
  • ostream 클래스의 인스턴스로, 문자열, 숫자, 사용자 정의 데이터 타입 등 다양한 형대의 데이터를 출력할 수 있다.
#include <iostream>

int main() {
    std::cout << "Hello, World!" << std::endl; // 문자열 출력
    std::cout << 123 << std::endl; // 숫자 출력
    std::cout << true << std::endl; // 불린 값 출력

    return 0;
}

endl

  • endl은 스트림에 새 줄(new line) 문자를 삽입하고, 스트림을 flush하는 역할이다. 즉, 버퍼에 저장되어 있던 모든 출력을 실제 출력 대상(화면, 파일)에 전송한다. 다양한 문자 타입(_Elem)과 특성(_Traits)을 가진 스트림에 대해 사용될 수 있다.

  • C++/CLI 환경에서 사용하기 위해 __CLRCALL_OR_CDECL호출 규약을 사용한다. (CLR 식 스택에 매개 변수를 순서대로(왼쪽에서 오른쪽으로) 로드)

? https://learn.microsoft.com/ko-kr/cpp/cpp/argument-passing-and-naming-conventions?view=msvc-170

_EXPORT_STD template <class _Elem, class _Traits>
basic_ostream<_Elem, _Traits>& __CLRCALL_OR_CDECL endl(
    basic_ostream<_Elem, _Traits>& _Ostr) { // insert newline and flush stream
    _Ostr.put(_Ostr.widen('\n'));
    _Ostr.flush();
    return _Ostr;
}

_Ostr.put(_Ostr.widen('\n'));

  • 주어진 스트림 Ostr에 새줄 문자를 삽입한다.
  • widen함수는 주어진 문자가 스트림의 문자 타입과 호환되도록 변환한다.
    (e.g. 스트림이 wchar_t타입 문자를 사용한다면, \n은 해당 타입으로 확장된다.)

_Ostr.flush();

  • 스트림의 버퍼를 강제로 비워서 모든 대기중인 출력이 전송되도록 한다.
  • 수정된 스트림 _Ostr을 반환하여 연속된 스트림 연산을 가능하게 한다.

Simple

  • 스트림에 새 줄을 추가하고, 출력을 즉시 전송하기 위해 스트림을 비우는 역할을 한다.

스트림(Stream)

  • 데이터의 흐름을 나타내며, 일반적으로 데이터의 순차적인 읽기 또는 쓰기를 추상화하는데 사용된다. 파일, 입출력장치, 메모리 등 다양한 데이터 소스나 목적지와의 데이터 교환을 용이하게 한다. C++ 표준 라이브러리는 istream(입력), ostream(출력), iostream(입출력) 등 다양한 스트림 클래스를 제공한다.

버퍼(Buffer)

  • 임시 저장공간을 의미한다. 데이터를 최종 목적지로 전송하기 전에 일시적으로 보관하는 메모리 영역이다. IO 작업의 효율성을 높이기 위해 사용되며, 데이터를 즉각적으로 전송하는 대신 충분한 양이 모일 때까지 or 특정 조건이 만족될 때까지 데이터를 모은다.

스트림 버퍼링

  • 데이터를 쓰거나 읽는 과정에서 발생하는 IO 작업의 수를 줄여, 더 효율적인 데이터 처리를 가능하게 한다.

  • e.g. 파일에서 데이터를 한 번에 한 글자씩 읽는 대신, 여러 글자를 한 번에 버퍼로 읽어 들여 처리하는 것이 효율적이다.


Operator<<

  • C++에서 사용되는 연산자 오버로딩 중 하나로, "left shift"연산자로 알려져 있다.

스트림 연산자로서 사용

  • 표준 출력 스트림 std::ostream 클래스와 같은 스트림에 데이터를 쓰는 연산을 수행할 떄 사용된다.
std::cout << "Hello, World!" << std::endl;
  • 변수 문자 리터럴, 숫자 등 다양한 타입의 데이터를 출력 스트림에 삽입한다.

  • 위 코드에서 operator<<"Hello, World!" 문자열을 std::cout 스트림에 삽입하고, std::endl을 통해 개행 문자와 함께 스트림을 flush 한느 역할을 한다.

사용자 정의 타입에 대한 오버로딩

  • operator<<를 사용자 정의 타입에 대해 오버로드함으로써, 해당 타입의 객체를 쉽게 출력할 수 있도록 한다.
std::ostream& operator<<(std::ostream& os, const MyClass& obj) {
	// MyClass 객체 obj를 문자열로 변환하여 os에 삽입
	return os; // 스트림 참조 반환
}
  • 이렇게 오버로딩 된 operator<<를 사용하면 MyClass 타입의 객체를 std::cout을 사용해 직접 출력할 수 있다.
MyClass obj;
std::cout << obj << std::endl;

0개의 댓글