Computer Science/C++

[C++] iostream 표준 입출력 라이브러리

림 림 2020. 7. 2. 14:48
반응형
C++ 표준 입출력 라이브러리의 구성, 클래스 템플릿, 객체, 타입, 조작자에 대한 설명을
http://www.cplusplus.com/reference/iolibrary/ 의 내용을 참고하여 작성하였습니다.

 

#라이브러리

iostream은 스트림을 사용한 입출력을 제공하는 객체 지향 라이브러리이다.

 

#스트림(stream)

스트림이란 입출력 작업이 수행되는 장치를 추상화한 개념이다.

스트림은 기본적으로 임의의 길이의 문자들(characters)의 근원지(source) 또는 도착지(destination)로 표현된다.

실제로 스트림은 문자들의 근원지와 도착지의 역할을 하는 물리적인 장치와 연관되어 있다. 예를 들어 디스크 파일, 키보드, 콘솔 창 등이 있다.

따라서 스트림이라는 추상적 개념에 입력된 문자들은 물리적 장치로 입력된 문자들이라고 할 수 있고, 스트림으로부터 출력된 문자들은 물리적 장치에 출력된 문자들이라고 할 수 있다.

예를 들어서 파일 스트림(file stream)은 파일을 조작하거나 상호 작용을 하기 위한 C++ 객체이다. 파일 스트림이 파일을 열기 위해서 한 번 사용되면, 그 스트림에 수행된 모든 입출력들은 해당하는 물리적인 파일에 그대로 반영된다.

 

#C++ 표준 입출력 라이브러리의 구성 요소

1. Basic class templates

iostream 라이브러리는 기본적으로 클래스 템플릿의 계층 구조에 포함된다. 

각각의 클래스 템플릿은 두 개의 매개변수를 가진다. char type (charT) 매개변수와 traits 매개변수이다.

클래스 계층 구조에서, 클래스 템플릿은 그 클래스 템플릿 이름의 앞에 basic_ 이 붙은 이름의 클래스 템플릿에서 인스턴스화 된 것이라고 할 수 있다. 예를 들어, 클래스 템플릿 istream은 basic_istream에서, fstream은 basic_fstream에서 인스턴스화 된 것이다. 유일한 예외는 ios_base인데, ios_base는 그 자체로 타입에 구애받지 않기 때문에(type-independent) 템플릿에 기반을 둔 것이 아니라 그저 클래스이다.

 

2. Class template instantiations

iostream의 모든 클래스 템플릿은 두 가지 표준으로 인스턴스화 된다. 하나는 요소를 char 형으로 조작하는 narrow-oriented, 다른 하나는 요소를 wchar_t 형으로 조작하는 wide-oriented이다. 

위 사진은 narrow-oriented 으로 인스턴스화 된 클래스의 관계를 보여준다.

wide-oriented으로 인스턴스화 된 클래스들은 클래스 이름의 앞에 w가 붙는다. 예를 들면 wios, wistream, wofstream 등이 있다.

 

3. Standard objects

iostream 라이브러리의 일부분에 표준 입출력 작업을 실행하는 표준 객체들이 정의되어 있다. 

표준 객체들 역시 narrow-oriented 객체와 wide-oriented 객체로 나뉜다. 

narrow-oriented 객체에는 cin, cout, cerr, clog 등이 있고, wied-oriented 객체에는 wcin, wcout, wcerr, wclog 등이 있다.

 

4. Types

클래스 멤버에 사용되는 타입들이 정의되어 있다.

클래스 멤버에는 기본적인 타입들을 거의 사용하지 않는다. 일반적으로 클래스의 인스턴스화에 사용되는 traits에 기반하여 타입을 정의하여 사용한다.  

예를 들면 char, wchar_t 인스턴스화에서, 타입 streampos, streamoff, streamsize 들은 각각 position, offset, size를 표현한다.

 

5. Manipulators

조작자는 스트림 객체에 수행되는 삽입 연산자(<<)와 추출 연산자(>>)와 함께 사용되도록 설계된 전역 함수이다.

일반적으로 조작자는 스트림의 속성과 형식을 수정한다.

예를 들면 endl, hex, scientific 등이 있다.

 

 

#C++ 표준 입출력 라이브러리의 종류

<ios>, <istream>, <ostream>, <streambuf>, <iosfwd>
C++ 프로그램에 직접적으로 거의 쓰이지 않는다. 계층 구조의 베이스를 나타내며, 여기서 파생된 클래스들을 포함하는 헤더 파일이나 라이브러리에 자동으로 포함된다.

<iostream>
표준 입출력을 위한 객체를 정의한다. cin, cout 등이 여기에 포함된다.

<fstream>
파일 스트림 클래스와 파일 내부 버퍼 객체를 정의한다. 스트림을 사용하여 파일을 조작하는 데에 사용된다.

<sstream>
문자열 객체를 조작하는 데에 사용되는 클래스를 정의한다.

<iomanip> 
표준 조작자와 매개변수를 정의한다. 이들은 삽입/추출 연산자와 함께 쓰이며 내부 플래그들과 서식 옵션을 수정하는 데에 쓰인다.

 

#iostream 라이브러리의 구성 요소

1. 클래스

ios_base: 스트림의 베이스 클래스
ios: 스트림의 베이스 클래스(type-dependent components)
istream: 입력 스트림 클래스
ostream: 출력 스트림 클래스
iostream: 입출력 스트림 클래스
ifstream: 파일 입력 스트림 클래스
ofstream: 파일 출력 스트림 클래스
fstream: 파일 입출력 스트림 클래스
istringstream: 문자열 입력 스트림 클래스
ostringstream: 문자열 출력 스트림 클래스
stringstream: 문자열 입출력 스트림 클래스
streambuf: 스트림의 베이스 버퍼 클래스
filebuf: 파일 스트림 버퍼 클래스
stringbuf: 문자열 스트림 버퍼 클래스

2. 객체

cin: 표준 입력 스트림 객체
cout: 표준 출력 스트림 객체
cerr:
표준 오류 출력 스트림 객체
clog:
표준 로그 출력 스트림 객체

3. 타입

fpos스트림 포지션 클래스 템플릿
streamoff스트림 오프셋 타입
streampos스트림 포지션 타입
streamsize스트림 사이즈 타입

4. 조작자

boolalpha: 알파벳으로 부울 값(true, false)을 나타낸다.
dec: 십진법을 사용한다.
endl뉴라인('\n')을 추가하고 플러쉬한다.
endsnull 문자를 삽입한다.
fixed고정 소수점 표기를 사용한다. (명시하지 않으면 부동 소수점 표기를 사용한다.)
flush스트림 버퍼를 플러쉬 한다.
hex16진법을 사용한다. 
internal내부의 한 포지션에 문자들을 삽입함으로써 필드를 조정한다. (출력 정렬을 채움으로 조정한다.)
left: 출력 정렬을 왼쪽으로 조정한다.
noboolalpha: 알파벳을 사용하지 않고 부울 값(0, 1)을 나타낸다.
noshowbase: prefix에 몇 진법으로 나타냈는지 표시하지 않는다.
noshowpoint: 소수점을 표시하지 않는다.
noshowpos: positive 부호(+)를 표시하지 않는다.
noskipws: 공백 문자를 생략하지 않는다.
nounitbuf: 삽입 후 플러쉬를 강제하지 않는다. (명시하지 않으면 매 삽입마다 플러쉬를 강제한다.)
nouppercase: 소문자로만 표시한다.
oct: 8진법을 사용한다.
resetiosflags: 형식 플래그를 초기화한다.
right: 출력 정렬을 오른쪽으로 조정한다.
scientific: 과학적 부동 소수점 표기법을 사용한다. (ex. 1.00000e-010 )
setbase: 몇 진법을 사용할 것인지 설정한다. (ex. std::setbase(16) )
setfill: 어떤 문자열로 채울 것인지 설정한다.
setiosflags: 형식 플래그를 설정한다.
setprecision: 소수점 몇 째 자리까지 표시할 것인지 설정한다.
setw: 출력 필드의 너비(문자 수)를 설정한다.
showbase: 몇 진법으로 나타냈는지 표시한다.
showpoint: 소수점을 표시한다.
showpos: positive 부호(+)를 표시한다.
skipws: 공백 문자를 생략한다.
unitbuf: 삽입 후 플러쉬 한다.
uppercase: 대문자로만 표시한다.
ws: 공백 문자를 추출한다.

 

#사용법

#include <iostream>

int main(int argc, const char * argv[]) {
    std::cout << "Hello, World!\n";
    return 0;
}

#include <iostream>을 통해 라이브러리를 소스 코드에 포함시킬 수 있다.

iostream 라이브러리에 있는 입출력 관련 구성 요소들을 사용할 수 있다.

반응형