[C++] 스트림(stream)(1) iostream 기본

Gamchan Kang·2023년 4월 8일
0

C++

목록 보기
5/11

새로운 언어를 배우면 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 자체가 다른데 처음 접했을 때 의문이 들었다.

1. stream과 stream buffer

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)도 스트림에 올라타 화면으로 나오도록 하는 키워드이다.


2. iostream

2-1 iostream 개요

stream중 가장 많이 쓰이는 iostream을 살펴보자.

iostream(입출력 스트림)은 fstream(파일 스트림)의 부모 클래스(상속함)이며 istream(입력 스트림)과 ostream(출력 스트림)의 자식 클래스(상속 받음)이다.

이를 좀 더 풀어서 설명하자면,

  • iostream은 istream과 ostream의 특징을 가지고 있고
  • iostream이 가진 특징은 fstream에 전달된다.

또한 <iostream>을 include 하면 그 위의 헤더: <istream> <ostream> <ios>를 자동으로 include 할 수 있다.


2-2 <ostream>

ostream cppreference 문서

Functions - manipulator를 보면 많은 키워드가 보인다.

이 중 endlflush를 주목해보자.
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)이 훨씬 빠르기 때문이다.


쓰다보니 내용이 길어져서 여러 편에 걸쳐 포스팅할 예정이다.

profile
Someday, the dream will come true

0개의 댓글