728x90

황기태 저자의 명품 C++ Programming 개정판을 읽고 학습한 내용을 정리한 포스트입니다!

https://search.shopping.naver.com/book/catalog/32436115747

 

C++ Programming : 네이버 도서

네이버 도서 상세정보를 제공합니다.

search.shopping.naver.com

스트림

  • 컴퓨터 기술에서 스트림은 연속적인 테이터의 흐름 혹은 데이터를 전송하는 소프트웨어 모듈을 말한다.
  • 아래와 같은 그림에서 프래그램과 장치를 연결하며 바이트 단위로 입출력하며 순서대로 지나가도록 한다.
  • 입력 스트림과 출력 스트림으로 나뉘며 입력 스트림은 키보드, 파일 등 입력 장치로부터 입력된 데이터를 순서대로 프로그램에 전달하는 객체이며, 출력 스트림은 프로그램에서 출력한 데이터를 프린터나 하드 디스크 같은 목적 장치로 순서대로 보내는 객체이다.
  • C++ 응용 프로그램은 출력 장치에 직접 출력하는 대신 출력 스트림에 출력하고, 입력 장치로부터 직접 입력받는 대신, 입력 스트림으로부터 입력 받는다.
  • C++의 표준 입력 스트림 객체는 cin이며, 표준 출력 스트림 객체는 cout이다.


 

C++ 입출력 스트림 버퍼

  • C++ 입출력 스트림의 중요한 특징은 스트림이 버퍼를 가진다는 점
  • 입력 스트림 버퍼는 입력된 데이터를 프로그램에 전달하기 전에 일시 저장하는 공간이며, 출력 스트림 버퍼는 출력 장치로 보내기 전에 데이터를 일시 저장하는 공간이다.
키 입력 스트림 버퍼
  • 키보드에 연결된 cin 입력 스트림의 경우를 아래 그림에 나타내었다.
  • Hellu 키를 순서대로 버퍼에 저장하고 프로그램에는 전달하지 않는데 아직 사용자의 키 입력이 끝났다고 볼 수 없기에 기다린다. <Enter> 키를 입력하여야 비로소 C++ 프로그램에 전달된다.
  • <Backspace> 키를 입력하여 가장 최근의 'u'를 지우는 것처럼 버퍼에 저장되는 대신 버퍼를 제어하는 제어키의 역할을 한다.

스크린 출력 스트림 버퍼
  • 스크린에 연결된 cout 출력 스트림을 아래 그림에 나타내었다.
  • 출력스트림은 보통 '\n'이 도착하거나 버퍼가 꽉 찰 때 스크린에 출력시킨다.
  • 혹은 cout.flush() 명령을 이용하여 버퍼에 있는 내용을 모두 장치에 출력한다.

 

버퍼의 필요성
  • C++ 입출력 스트림은 운영체제 API를 호출하여 입출력 장치와 프로그램 사이에서 데이터를 전송한다.
  • 만일 버퍼가 없다면, 프로그램이 몇 바이트씩 파일 쓰기를 실행할 때마다 운영체제 API를 호출하고, 운영체제 API는 그 때마다 하드 디스크에 명령을 내려 파일에 기록하기에 시스템의 효율이 나빠진다.
  • 버퍼가 있다면스트림 버퍼에 모아 두었다가 한 번에 운영체제 API를 호출하여 파일에 쓰면 OS와 장치를 구동하는 횟수가 줄어 시스템 효율이 올라간다.

입출력 방식에는 스트림 뿐만 아니라, 버퍼를 가지지 않는 저수준 입출력 방식(raw level console I/O)가 존재한다. 저수준 입출력 방식에서는 키가 입력되는 즉시 프로그램에 전달된다. 

게임과 같은 특별한 응용 프로그램 제작을 위해, 대부분의 C++ 컴파일러 회사들이 저마다 독특한 저수준 입출력 라이브러리를 제공하지만, 표준 C++에서는 오직 스트림 입출력만 다룬다.


C++ 입출력 라이브러리

  • 2003년에 ANSI/ISO C++ 표준위에서는 C++ 입출력 표준을 대폭적으로 수정하였다.
  • 입출력 라이브러리를 템플릿을 이용하여 재작성하고, char 타입의 한 바이트로만 문자를 다루도록 작성된 것을 다국 어 수용을 위해 여러 바이트로 구성되는 문자를 다룰 수 있도록 개선하였다.

 

2003년 이전의 C++ 입출력 라이브러리
  • 과거 입출력 시스템은 영어와 같이 문자 하나를 한 바이트로 표현하는 언어의 문장만 입출력하도록 작성되었기에, 문자 하나가 2바이트로 구성되는 한글 문자를 입력할 수 없다.
  • 아래는 문자를 한 바이트로만 다루는 클래스이다.
ios, istream, ostream, iostream, ifstream, ofstream, fstream

 

현 표준의 C++ 입출력 라이브러리
  • 여러 바이트로 표현하는 다국어의 입출력을 위해 ANSI/ISO C++ 표준위에서는 템플릿(template)을 사용하여 C++ 입출력 라이브러리를 일반화시켰다.
  • 따라서, 새 표준을 사용하는 C++ 개발자들은 이들 클래스에 구체적인 타입을 대입하여 입출력 클래스를 구체화(specialization)하여 사용해야 한다.
basic_ios, basic_istream, basic_ostream, basic_iostream, basic_ifstream, basic_ofstream, basic_fstream

상속 관계

  • 또한 구 표준을 기반으로 작성된 C++ 프로그램과의 호환성을 위해, 현재 입출력 라이브러리의 헤더 파일에 아래와 같이 템플릿을 char 타입으로 구체화 시키고, using 키워드를 이용하여 ios, istream 등 과거의 이름들을 그대로 사용할 수 있도록 하였다.
  • 표준이 변했다 하더라도 지금도 여전히 cin으로는 한글을 문자 단위로는 읽을 수 없다는 점을 기억해야 한다..!!
using ios = basic_ios<char, char_traits<char>>;
using istream = basic_istream<char, char_traits<char>>;
using iostream = basic_iostream<char, char_traits<char>>;

 

클래스 설명
ios 모든 입출력 스트림 클래스들의 기본(Base) 클래스. 스트림 입출력에 필요한 공통 함수와 상수, 멤버 변수 선언
istream,
ostream,
iostream
istream은 문자 단위 입력 스트림.
ostream은 문자 단위 출력 스트림.
iostream은 문자 단위로 입출력을 동시에 할 수 잇는 스트림 클래스
ifstream,
ofstream,
fstream
파일에서 읽고 쓰는 기능을 가진 파일 입출력 스트림 클래스.
파일에서 읽을 때는 ifstream 클래스를,
파일에 쓸 때는 ofstream 클래스를,
읽고 쓰기를 동시에 할 때 fstream 클래스이용 

 

C++ 표준 입출력 스트림 객체

  • <iostream>헤더 파일을 include 한 C++ 프로그램이 실행되면 cin, cout, cerr 등 표준 입출력 스트림 객체가 생성

 

728x90

'Programming Language > C++' 카테고리의 다른 글

[C++] 포맷  (1) 2023.12.21
[C++] ostream과 istream  (1) 2023.12.20
[C++] struct with Cpp  (3) 2023.12.20
[C++] queue, deque with Cpp  (1) 2023.12.20
[C++] Stack with Cpp  (0) 2023.12.20