728x90
황기태 저자의 명품 C++ Programming 개정판을 읽고 학습한 내용을 정리한 포스트입니다!
https://search.shopping.naver.com/book/catalog/32436115747
스트림
- 컴퓨터 기술에서 스트림은 연속적인 테이터의 흐름 혹은 데이터를 전송하는 소프트웨어 모듈을 말한다.
- 아래와 같은 그림에서 프래그램과 장치를 연결하며 바이트 단위로 입출력하며 순서대로 지나가도록 한다.
- 입력 스트림과 출력 스트림으로 나뉘며 입력 스트림은 키보드, 파일 등 입력 장치로부터 입력된 데이터를 순서대로 프로그램에 전달하는 객체이며, 출력 스트림은 프로그램에서 출력한 데이터를 프린터나 하드 디스크 같은 목적 장치로 순서대로 보내는 객체이다.
- 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 |