새로운 언어를 배우면 Hello World 프로그램을 작성한다. C++에서 Hello World 프로그램은 다음과 같다.
#include <iostream>
int main() {
std::cout << "Hello World" << std::endl;
return 0;
}
맨 처음 C++를 접했을 때, iostream
이라는 헤더와 std::cout
, std::endl
이라는 키워드가 C와 달랐다. 나는 맨 처음 프로그래밍을 C로 접해서 이런 키워드가 낯설었다.
그 중 std::cout
은 C의 printf
함수와 syntax 자체가 다른데 처음 접했을 때 의문이 들었다.
C++이든 python이든 java든 STL에 기본으로 설정된 함수는 이름에서 어느 정도 용도를 파악할 수 있다.
iostream
도 그렇다.
iostream
은 input/output stream을 줄인 말이다.
input/output은 대상이 키보드(input)와 모니터(output)일수도, 파일(input, output)일수도 있다.
그렇다면 stream은 뭘까? stream은 '흐르다'라는 뜻의 동사다. 그렇다면 무엇이 어떻게 흐르는 지가 중요하다.
변수를 설명할 때, 데이터를 담은 바구니로 설명을 한다. 어떤(종류, 이름) 바구니에 무엇이 담겨있는지가 중요한 포인트이다. 그 중 stream은 변수라는 바구니 속 담겨있는 '무엇'이 흐르는 것이다.
그리고 그 '무엇의 흐름'은 buffer라는 중간 객체로 표현된다. 마치 시냇물에 손을 넣어서 흐름이 느껴지는 것과 같다.
이러한 내용을 도식화 하면 다음과 같다.
처음에 표시한 Hello World 프로그램을 살펴보자.
std::cout << "Hello World" << std::endl;
여기에서 std::cout
스트림에 "Hello World"
가 버퍼에서 흘러 나온다.
그리고 스트림 도착 지점은 바로 화면(콘솔 창)인 셈이다. 마지막 std::endl
은 줄바꿈 기호(\n
)도 스트림에 올라타 화면으로 나오도록 하는 키워드이다.
iostream
iostream
개요stream중 가장 많이 쓰이는 iostream
을 살펴보자.
iostream
(입출력 스트림)은 fstream
(파일 스트림)의 부모 클래스(상속함)이며 istream
(입력 스트림)과 ostream
(출력 스트림)의 자식 클래스(상속 받음)이다.
이를 좀 더 풀어서 설명하자면,
또한 <iostream>
을 include 하면 그 위의 헤더: <istream> <ostream> <ios>
를 자동으로 include 할 수 있다.
<ostream>
Functions - manipulator를 보면 많은 키워드가 보인다.
이 중 endl
과 flush
를 주목해보자.
flush
는 출력 버퍼를 쏟아서 비워내는 행위이다.
endl
은 출력 버퍼를 쏟아내고 새로운 줄에 출력하는 행위이다.
#include <iostream>
int main(){
std::cout << "flushed: " << std::flush;
std::cout << "flushed and newline" << std::endl;
return 0;
}
콘솔 창을 보면 새로운 빈 줄이 생겼음을 알 수 있다.
지금은 큰 문제가 없지만, std::endl
보단 \n
으로 줄 바꿈이 성능 측면에서는 권장된다.
출력 버퍼를 전부 비워내는 것(endl
)보단 줄 바꿈(\n
)이 훨씬 빠르기 때문이다.
쓰다보니 내용이 길어져서 여러 편에 걸쳐 포스팅할 예정이다.