
#include <iostream>
int main() {
std::cout << "Hello, World!" << std::endl; // 문자열 출력
std::cout << 123 << std::endl; // 숫자 출력
std::cout << true << std::endl; // 불린 값 출력
return 0;
}
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에 새줄 문자를 삽입한다.widen함수는 주어진 문자가 스트림의 문자 타입과 호환되도록 변환한다.wchar_t타입 문자를 사용한다면, \n은 해당 타입으로 확장된다.)_Ostr을 반환하여 연속된 스트림 연산을 가능하게 한다.istream(입력), ostream(출력), iostream(입출력) 등 다양한 스트림 클래스를 제공한다.데이터를 쓰거나 읽는 과정에서 발생하는 IO 작업의 수를 줄여, 더 효율적인 데이터 처리를 가능하게 한다.
e.g. 파일에서 데이터를 한 번에 한 글자씩 읽는 대신, 여러 글자를 한 번에 버퍼로 읽어 들여 처리하는 것이 효율적이다.
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;