맨위로가기

Iostream

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.

1. 개요

iostream은 C++ 표준 라이브러리의 헤더 파일로, 비야네 스트롭스트루프가 C 파일 입출력의 대안으로 개발했다. 이 라이브러리는 형식 지정을 제어하는 조작자와 템플릿화를 통해 개선되었으며, C++23에서 `std::print()` 및 `std::println()` 함수가 추가되었다. iostream은 하위 수준의 스트림 버퍼, `ios_base` 및 `basic_ios`와 같은 지원 클래스, 그리고 상위 수준의 입력/출력 스트림으로 구성된다. 또한, `cin`, `cout`, `cerr`, `clog` 객체를 사용하여 표준 입출력, 오류, 로그를 처리한다.

더 읽어볼만한 페이지

  • C++ 표준 라이브러리 - 표준 템플릿 라이브러리
    표준 템플릿 라이브러리(STL)는 알렉산더 스테파노프의 주도로 탄생한 C++ 라이브러리로서, 제네릭 프로그래밍을 지원하기 위해 컨테이너, 반복자, 알고리즘, 함수 객체 등의 핵심 구성 요소로 이루어져 있으며, HP에서 무료로 공개한 구현을 기반으로 다양한 구현체가 존재한다.
  • C++ 표준 라이브러리 - 할당자
    할당자는 C++에서 메모리 할당을 관리하며, STL 컨테이너의 메모리 모델 독립성을 지원하고, 메모리 할당, 해제, 객체 생성, 파괴를 담당하는 클래스이다.
Iostream
개요
종류C++ 표준 라이브러리 헤더 파일
사용C++ 스트림 클래스 기반 입출력
헤더 파일iostream
포함할 것'#include '
설명
기능C++ 프로그래밍 언어에서 입출력 연산을 수행하는 데 사용되는 표준 라이브러리 헤더 파일임.
스트림 기반의 입출력 클래스와 객체를 제공하여 콘솔, 파일, 문자열 등 다양한 입출력 소스를 다룰 수 있도록 지원함.
주요 클래스istream: 입력 스트림 클래스
ostream: 출력 스트림 클래스
iostream: 입출력 스트림 클래스
주요 객체cin: 표준 입력 스트림 객체 (키보드로부터 입력)
cout: 표준 출력 스트림 객체 (콘솔로 출력)
cerr: 표준 에러 스트림 객체 (콘솔로 에러 출력, 버퍼링 없음)
clog: 표준 로그 스트림 객체 (콘솔로 로그 출력, 버퍼링)
연산자'<<': 출력 연산자 (삽입 연산자)
'>>': 입력 연산자 (추출 연산자)
특징타입 안정성: 컴파일 시간에 데이터 타입을 검사하여 타입 관련 오류를 줄임.
확장성: 사용자 정의 타입에 대한 입출력 연산자 오버로딩을 통해 확장 가능.
객체 지향: 스트림을 객체로 다루어 입출력 연산을 객체 지향적으로 처리.
형식화된 입출력: 다양한 형식 지정자를 사용하여 출력 형식을 제어.
예시
표준 출력'#include int main() { std::cout << "Hello, World!" << std::endl; return 0; }'
표준 입력'#include int main() { int number; std::cin >> number; std::cout << "You entered: " << number << std::endl; return 0; }'

2. 역사

C++의 창시자인 비야네 스트롭스트루프는 1984년, 기존 C 파일 입출력 방식보다 형 안전성이 높고 확장 가능한 대안으로 스트림 입출력(I/O) 라이브러리의 첫 버전을 개발했다.[5] 이 초기 라이브러리는 이후 여러 개선을 거쳤는데, 대표적으로 출력 형식을 제어하는 조작자(manipulator) 도입과 'char' 외 다른 문자 타입에도 적용할 수 있도록 템플릿을 활용한 점을 들 수 있다.

1998년 C++ 표준화 과정에서 이 라이브러리는 'std' 네임스페이스로 편입되었고, 주 사용 헤더 파일 이름도 기존의 ''에서 ''으로 변경되었다.

C++23 표준 개정에서 새로운 헤더 파일인 ''가 추가되었다. 이 헤더는 'std::print()'와 'std::println()' 함수를 제공하여, 다양한 출력 스트림이나 파일 스트림에 형식을 갖춘 출력을 더 쉽게 할 수 있도록 지원한다.

3. 구성 요소

C++ 입출력 라이브러리의 클래스들은 대부분 일반화된 클래스 템플릿으로 구현되어 있어 다양한 문자 유형에서 작동할 수 있다. 일반적으로 사용되는 템플릿과 문자 유형 조합에는 typedef를 통해 접근한다. 예를 들어, 파일 스트림 입출력을 구현하는 basic_fstream 템플릿은 보통 fstream이라는 typedef로 사용되는데, 이는 char 타입 문자에 대해 작동하는 basic_fstream>의 별칭이다.

라이브러리의 클래스는 크게 두 가지 기준으로 분류할 수 있다.

1. 추상화와 구현: 추상화 클래스는 특정 데이터 소스나 싱크(sink)에 의존하지 않고 모든 종류의 스트림에서 작동하는 인터페이스를 제공한다. 구현 클래스는 추상화 클래스를 상속받아 파일이나 메모리 버퍼와 같은 구체적인 데이터 소스/싱크에 대한 기능을 구현한다.

2. 하위 수준과 상위 수준: 하위 수준 작업을 처리하는 클래스는 스트림 버퍼(stream buffer)라고 하며, 서식 지정 없이 문자를 다룬다. 상위 수준 작업을 처리하는 클래스는 스트림(stream)이라고 하며, 스트림 버퍼를 기반으로 다양한 서식 지정 기능을 제공한다.

다음 표는 입출력 라이브러리에서 제공하는 주요 클래스를 기능별로 분류한 것이다.

클래스설명Typedefs
스트림 버퍼 (하위 수준 기능)
basic_streambuf특정 데이터 소스/싱크에 대해 구현될 수 있는 추상 하위 수준 입출력 인터페이스. 직접 사용되는 경우는 드물다.style="white-space:nowrap;" |
basic_filebuf파일 기반 스트림의 하위 수준 입출력 인터페이스 구현. 직접 사용되는 경우는 드물다.style="white-space:nowrap;" |
basic_stringbuf문자열 기반 스트림의 하위 수준 입출력 인터페이스 구현. 직접 사용되는 경우는 드물다.style="white-space:nowrap;" |
지원 클래스
ios_base서식 지정 정보 및 예외 상태 관리.
basic_ios스트림 버퍼 관리.style="white-space:nowrap;" |
입력 스트림 (상위 수준 기능)
basic_istream추상 스트림 버퍼를 감싸 상위 수준 입력 인터페이스(서식 지정 등) 제공.style="white-space:nowrap;" |
basic_ifstream파일 스트림 버퍼를 감싸는 입력 스트림. 파일 열기/닫기 기능 추가 제공.style="white-space:nowrap;" |
basic_istringstream문자열 스트림 버퍼를 감싸는 입력 스트림. 기본 문자열 접근 기능 추가 제공.style="white-space:nowrap;" |
출력 스트림 (상위 수준 기능)
basic_ostream추상 스트림 버퍼를 감싸 상위 수준 출력 인터페이스(서식 지정 등) 제공.style="white-space:nowrap;" |
basic_ofstream파일 스트림 버퍼를 감싸는 출력 스트림. 파일 열기/닫기 기능 추가 제공.style="white-space:nowrap;" |
basic_ostringstream문자열 스트림 버퍼를 감싸는 출력 스트림. 기본 문자열 접근 기능 추가 제공.style="white-space:nowrap;" |
입출력 스트림 (상위 수준 기능)
basic_iostream추상 스트림 버퍼를 감싸 상위 수준 입출력 인터페이스(서식 지정 등) 제공.style="white-space:nowrap;" |
basic_fstream파일 스트림 버퍼를 감싸는 입출력 스트림. 파일 열기/닫기 기능 추가 제공.style="white-space:nowrap;" |
basic_stringstream문자열 스트림 버퍼를 감싸는 입출력 스트림. 기본 문자열 접근 기능 추가 제공.style="white-space:nowrap;" |


3. 1. 헤더 파일

입출력 라이브러리의 클래스들은 여러 헤더 파일에 나뉘어 있다. C++ 표준화 과정에서 라이브러리가 std 네임스페이스로 이동했으며, 주요 헤더가 에서 으로 변경되었다.[5] C++23 개정에서는 헤더가 추가되었다.

  • ``: 서식 정보와 스트림 버퍼를 관리하는 ios_basebasic_ios 클래스를 포함한다.
  • ``: 형식화된 입력을 처리하는 basic_istream 클래스 템플릿을 포함한다.
  • ``: 형식화된 출력을 처리하는 basic_ostream 클래스 템플릿을 포함한다.
  • ``: 형식화된 입출력을 처리하는 basic_iostream 클래스 템플릿을 포함하며, ``, ``, `` 헤더를 모두 포함한다.
  • ``: 파일 스트림에서 형식화된 입출력을 처리하는 basic_ifstream, basic_ofstream, basic_fstream 클래스 템플릿을 포함한다.
  • ``: 문자열 기반 스트림에서 형식화된 입출력을 처리하는 basic_istringstream, basic_ostringstream, basic_stringstream 클래스 템플릿을 포함한다.
  • ``: 서식 조작자(manipulator)를 포함한다. 이는 출력 형식을 제어하는 데 사용된다.
  • ``: 입출력 라이브러리의 모든 클래스에 대한 사전 선언(forward declaration)을 포함한다. 이는 전체 클래스 정의를 포함하지 않고 클래스 이름만 미리 알리는 역할을 한다.
  • `` (C++23): 모든 출력 스트림이나 파일 스트림에 형식화된 문자열을 출력할 수 있게 해주는 print 함수들을 포함한다. 여기에는 std::print()std::println()이 있으며, std::println()은 각 출력이 추가적인 새 줄 문자로 끝난다는 점을 제외하면 std::print()와 동일하게 동작한다.

3. 2. 스트림 버퍼 (Stream Buffers)

C++ 언어에는 표에 나와 있는 12개의 스트림 버퍼 클래스가 정의되어 있다.

3. 3. 지원 클래스 (Support Classes)

ios_basebasic_ios스트림의 하위 수준 기능을 관리하는 두 개의 클래스이다. ios_base는 서식 지정 정보와 스트림의 상태 정보를 저장하고 관리하는 역할을 한다. basic_ios는 스트림과 연결된 스트림 버퍼를 관리한다. basic_ios는 특정 문자 타입에 대한 typedef인 ios(char 타입) 또는 wios(wchar_t 타입)로 흔히 알려져 있다.

이 두 클래스는 프로그래머가 직접 사용하는 경우는 드물다. 일반적으로 이러한 기능들은 ios_basebasic_ios를 상속받는 `iostream`과 같은 다른 클래스를 통해 접근하여 사용하게 된다.

3. 3. 1. Typedefs

이름설명
ioschar 타입의 문자를 사용하는 basic_ios에 대한 편의 typedef이다.
wioswchar_t 타입의 문자를 사용하는 basic_ios에 대한 편의 typedef이다.
streamoff내부 연산을 지원한다.
streampos버퍼 포인터 또는 파일 포인터의 현재 위치를 저장한다.
wstreampos버퍼 포인터 또는 파일 포인터의 현재 위치를 저장한다.
streamsize스트림의 크기를 지정한다.


3. 3. 2. 서식 조작자 (Formatting Manipulators)

wikitext

이름설명
boolalpha / noboolalphabool 타입 변수가 스트림에서 문자열 truefalse로 표시될지, 아니면 숫자 10으로 표시될지 지정한다.
skipws / noskipws입력 스트림에서 데이터를 읽을 때 선행 공백 문자(whitespace)를 건너뛸지 여부를 지정한다.
showbase / noshowbase정수를 출력할 때 진법을 나타내는 접두사(예: 8진수의 0, 16진수의 0x)를 표시할지 여부를 지정한다.
showpoint / noshowpoint부동 소수점 수를 출력할 때 소수점 및 소수점 이하 0을 항상 표시할지 여부를 지정한다. noshowpoint는 소수 부분이 0일 경우 소수점과 0을 생략한다.
showpos / noshowpos음수가 아닌 수(0 포함)를 출력할 때 양수 부호(+)를 앞에 표시할지 여부를 지정한다.
unitbuf / nounitbuf각 출력 작업 후에 출력 버퍼를 자동으로 비울지(flush) 여부를 지정한다. unitbuf는 즉시 출력을 보장하지만 성능에 영향을 줄 수 있다.
uppercase / nouppercase16진수 출력 시 알파벳(a-f)이나 과학적 표기법의 지수 기호(e)를 대문자(A-F, E)로 표시할지 여부를 지정한다.
left / right / internal지정된 너비(width) 내에서 출력 값의 정렬 방식을 지정한다. left는 왼쪽, right는 오른쪽, internal은 부호나 진법 표시는 왼쪽에, 값은 오른쪽에 정렬한다.
dec / oct/ hex정수를 입출력할 때 사용할 기본 진법을 지정한다 (10진수, 8진수, 16진수).
fixed / scientific/
hexfloat(C++11) /
defaultfloat(C++11)
부동 소수점 수를 출력할 때 사용할 표기법을 지정한다. fixed는 고정 소수점, scientific은 과학적 표기법, hexfloat는 16진수 부동 소수점 표기법이며, defaultfloat는 값에 따라 fixed 또는 scientific 중 더 간결한 형태로 출력한다.


4. 입출력 스트림 (Input/Output Streams)

C++입출력 스트림은 주로 C++ 표준 라이브러리의 일부인 '''iostream''' 헤더 파일에 정의되어 있다. 이 이름은 '''I'''nput/'''O'''utput '''Stream'''을 의미한다. C 프로그래밍 언어와 달리 C++에는 데이터 입출력을 위한 특별한 문법이 없으며, 대신 서브루틴의 라이브러리 형태로 제공된다. iostream은 C의 stdio.h에서 기능을 가져온 cstdio 헤더와 마찬가지로 C++ 프로그램에 기본적인 입출력 서비스를 제공한다.

iostream 라이브러리는 객체인 '''cin'''(표준 입력), '''cout'''(표준 출력), '''cerr'''(표준 오류, 버퍼링 없음), '''clog'''(표준 로그, 버퍼링됨)를 통해 표준 스트림으로 데이터를 보내거나 받는다. 이 객체들은 C++ 표준 라이브러리의 일부이므로 '''std''' 네임스페이스에 속해 있다.[8]

'''cout''' 객체는 '''ostream''' 타입이다. 이 타입은 왼쪽 비트 시프트 연산자 (<<)를 오버로드하여 데이터를 출력 스트림으로 보내는 역할을 한다. 이는 원래의 비트 연산과는 다른 기능이며, 연산 결과로 왼쪽 피연산자(ostream 객체 자신)를 반환하여 여러 출력을 연이어 작성하는 메소드 캐스케이딩과 유사한 플루언트 인터페이스를 가능하게 한다. '''cerr'''와 '''clog''' 객체도 '''ostream''' 타입이므로 동일한 방식으로 작동한다.

반면, '''cin''' 객체는 '''istream''' 타입이며, 오른쪽 비트 시프트 연산자 (>>)를 오버로드하여 입력 스트림으로부터 데이터를 읽어온다. 비트 시프트 연산자의 방향(<<, >>)은 데이터가 출력 스트림으로 흘러가거나 입력 스트림에서 흘러나오는 것처럼 보이도록 시각적으로 표현한다.

4. 1. 출력 포매팅 (Output Formatting)

출력되는 내용의 형식을 조정하는 것을 출력 포매팅이라고 한다. 이는 width, fill, precision과 같은 특정 메서드나 다양한 조작자들을 사용하여 제어할 수 있다.[1] 이들을 이용하면 출력 너비, 채움 문자, 부동소수점 정밀도 등을 설정할 수 있다.

4. 1. 1. 메서드 (Methods)

wikitext

메서드설명
width(int x)다음 출력에 대한 최소 문자 수를 지정한다.
fill(char x)설정된 최소 폭보다 출력할 내용이 짧을 경우, 남는 공간을 채우는 데 사용될 문자를 지정한다.
precision(int x)부동소수점 숫자를 출력할 때 표시할 유효 자릿수를 설정한다.


4. 1. 2. 조작자 (Manipulators)

조작자(Manipulators)는 `` `<<` `` 또는 `` `>>` `` 연산자를 사용하여 스트림을 수정할 수 있는 객체이다.

조작자설명
`` `endl` ``"end line": 스트림에 줄 바꿈 문자를 삽입하고 flush를 호출한다.
`` `hex` ``"hexadecimal": 이후의 모든 숫자는 16진수로 출력된다.
`` `dec` ``"decimal": 16진수 설정을 끈다.
`` `ends` ``"end string": 스트림에 널 문자를 삽입하고 flush를 호출한다.
`` `flush` ``출력 스트림이 버퍼링된 모든 문자를 쓰도록 강제한다.
`` `ws` ``입력 스트림이 공백 문자를 제거하도록 한다.
`` `showpoint` ``스트림에 정수에도 소수점과 0을 표시하도록 한다.



다른 조작자는 헤더 iomanip을 사용하여 찾을 수 있다.

5. 사용 예

가장 기본적인 Hello world 프로그램은 다음과 같이 작성할 수 있다. using namespace std; 선언을 사용하면 std:: 접두사 없이 cout을 사용할 수 있다.



#include

using namespace std;

int main()

{

cout << "Hello, world!\n";

return 0;

}



이 코드는 "Hello, world!"라는 문자열과 함께 새 줄 문자를 화면에 출력한다.

네임스페이스를 명시적으로 사용하는 경우, C++23 표준 이전의 "Hello, World!" 프로그램 헤더 파일을 사용하여 다음과 같이 표현할 수 있다.



#include

int main() {

std::cout << "Hello, world!" << std::endl;

}



이 코드는 "Hello, world!"를 출력하고, std::endl을 통해 줄 바꿈과 함께 출력 버퍼를 비운다(flush).

파일 입출력을 위해서는 헤더 파일을 사용한다. 다음은 'file.txt'라는 이름의 파일을 생성하고, 그 안에 "Hello, world!" 문자열과 줄 바꿈 문자를 쓰는 예제이다.



#include

int main() {

std::ofstream file("file.txt");

file << "Hello, world!" << std::endl;

}



여기서 std::ofstream은 출력 파일 스트림을 다루는 클래스이다.

C++23 표준부터는 헤더 파일 또는 표준 라이브러리 모듈 std를 통해 std::println 함수를 사용할 수 있다. 이를 이용한 "Hello, World!" 프로그램은 다음과 같다.



import std; // 또는 #include

int main() {

std::println("Hello, world!");

}



std::println 함수는 자동으로 줄 바꿈을 추가해준다.

6. 비판

서식 조작자는 사용 후 재설정하지 않으면, 다음 출력문에서 의도하지 않은 결과가 나타날 수 있다.

일부 C++ 표준 라이브러리 구현에는 상당한 양의 데드 코드가 포함될 수 있다. 예를 들어, GNU libstdc++는 프로그램이 날짜, 시간, 통화 등 로케일의 영향을 받는 형식을 사용하지 않더라도, `ostream` 객체를 생성할 때 자동으로 로케일 관련 생성자를 호출하여 로케일을 설정한다.[9]

또한 GNU libstdc++ 환경에서 `iostream`을 사용하여 정적으로 연결된 "Hello, World!" 프로그램은 `cstdio`를 사용한 동일한 프로그램보다 실행 파일 크기가 상당히 커지는 경향이 있다.[10] 다만, 임베디드 시스템과 같이 공간 제약이 큰 환경을 위해 설계된 C++ 표준 라이브러리의 부분 구현에서는 프로그램에 필요하지 않은 기능(예: 로케일 지원)을 `iostream`에서 제외하여 크기를 줄이기도 한다.[11]

참조

[1] 간행물 ISO/IEC 14882:2003 Programming Languages – C++. [lib.string.streams]/1
[2] 서적 C++ Primer https://archive.org/[...] Addison-Wesley
[3] 서적 The C++ programming language https://archive.org/[...] Addison-Wesley 1997
[4] 서적 C++ Primer https://archive.org/[...] Addison-Wesley
[5] 웹사이트 A History of C++: 1979–1991 http://www.stroustru[...]
[6] 서적 C++ Primer https://archive.org/[...] Addison-Wesley
[7] 웹사이트 " Visual Studio 2010" http://msdn.microsof[...] Microsoft MSDN: Visual Studio 2010 2011-09-28
[8] 서적 C++ : Black Book Coriolis Group
[9] 문서 GNU libstdc++ source code, bits/ios_base.h
[10] 웹사이트 C++ vs. C – Pin Eight http://pineight.com/[...]
[11] 웹사이트 uClibc++ C++ library http://cxx.uclibc.or[...] 2012-01-06



본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.

문의하기 : help@durumis.com