Skip to content

Latest commit

 

History

History
74 lines (49 loc) · 6.93 KB

File metadata and controls

74 lines (49 loc) · 6.93 KB

스트림 (Stream)

C++ 프로그램에서 입력과 출력은 중요한 기능이다. 사용자와 인터랙티브한 프로그램을 작성하기 위해서는 입력과 출력 기능이 필요하다. 프로그래머가 입출력 장치에 따라 다른 방법(예: 함수)을 사용하여 프로그램을 작성해야 한다면 츨력 디바이스에 따라 다른 함수를 사용하여야 하기 때문에 매우 번거럽고 어려운 일이다. 이러한 문제를 해결하기 위해 제안된 것이 스트림(stream)으로 C++에서는 입력과 출력 모두 스트림을 통해 이루어진다. 스트림은 개념적으로 연속적인 데이터의 흐름으로 데이터를 전송하는 소프트웨어 모듈을 뜻한다.

프로그램에서 모니터, 네트워크, 프린터, 저장장치 등과 같이 프로그램 외부 장치에 데이터를 내보내는 것은 출력 스트림을 통해서 이루어지며 키보드, 저장장치 등과 같이 프로그램 외부 장치에서 데이터를 가져오는 것은 입력 스트림을 통해 이루어진다.

즉, 스트림은 프로그램과 장치를 장치에 독립적(모든 장치에 동일한 접근 방식을 제공하여 입출력 장치에 관계없이 프로그램을 작성할 수 있다.)으로 연결하며 데이터는 바이트 단위로 나뉘어 순서대로 주고 받는다.

스트림을 활용한 대표적인 입출력 객체로 다음의 객체가 있다.

  • cin 객체(표준 입력 스트림): 클래스 istream의 객체로 저장장치, 키보드 등과 같은 표준 입력 장치로 부터 데이터를 얻는데 사용된다.
  • cout 객체(표준 출력 스트림): 클래스 ostream의 객체로 표준 출력 장치로 데이터를 출력하는 데 사용된다.
  • cerr 객체(버퍼링 되지 않는 표준 에러 스트림): 클래스 ostream의 객체로 발생한 에러를 스크린에 즉시 출력하기 위한 것으로 버퍼에 에러를 저장하지 않는다.
  • clog 객체(버퍼링 되는 표준 에러 스트림): cerr와 같이 에러를 출력하지만 버퍼를 사용하여 버퍼가 꽉 찰 때까지 에러 데이터를 저장한 후 버퍼가 다 채워지면 스크린에 출력을 한다.

스트림 내부에는 버퍼(buffer)라는 저장 공간이 있다. 프로그램에서 키보드로 부터 데이터를 입력받을 때 버퍼를 사용하지 않는 경우 키보드에서 키를 누를 때마다 프로그램에 전달하나 버퍼를 사용하는 경우 키보드에서 키를 누를 때마다 버퍼에 전송이 이루어지고 버퍼가 가득 차거나 줄바꿈 문자를 만다면 버퍼의 내용을 모두 프로그램에 전달한다.

일반적으로 버퍼를 사용하는 경우 문자를 하나씩 프로그램으로 전달하기 보다는 전송 시간이 짧고 문자가 입력되었을 때 수정을 할 수 있다는 장점을 가지나 게임과 같이 키보드의 키 누름에 빠른 반응이 요구되는 경우는 버퍼를 사용하지 않아야 한다. 버퍼를 사용하는 입출력과 버퍼를 사용하지 않는 입출력은 서로 다른 용도로 사용되기 때문에 목적에 맞게 버퍼의 사용 여부를 결정해야 한다.

C++ 프로그램에서 키보드 입력의 경우 사용자가 enter 키를 누르면 입력 버퍼를 비우고, 출력할 경우는 줄 바꿈 문자가 있는 경우 출력 버퍼를 비운다.

iostream 라이브러리

iostream

<출처: http://www.cplus.com>

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

C++ 언어에서는 입출력에 관한 기능을 기본적으로 제공하지 않고 라이브러리의 형태로 제공한다. 이는 컴파일러 개발자에게 입출력 기능을 수행하는 하드웨어에 가장 적합한 형태로 컴파일러를 만들 수 있도록 하기 위해서이다. C++ 컴파일러는 iostream 또는 fstream 헤더 파일에 정의된 클래스 라이브러리를 제공한다. 스트림은 iostream과 fstream 클래스 라이브러리의 중요 개념으로 입력과 출력 기능이 실행되는 디바이스를 추상화한 것이다. 즉 C++ 프로그램은 파일이나 콘솔의 입출력을 직접 다루지 않고 스트림이라는 흐름을 통해 처리한다.

스트림은 기본적으로 길이가 명확하지 않은 문자들의 소스(source)와 목적지(destination)로 표현될 수 있다. 일반적으로 스트림은 디스크 파일, 키보드 또는 콘솔과 같은 문자들의 물리적인 소스와 목적지와 관련이 있다. 그러므로 문자를 입력받는 스트림은 입력을 처리하는 물리적인 디바이스를 추상화하고 문자를 쓸 수 있는 스트림은 출력을 처리하는 물리적인 다비이스를 추상화한다.

예로 파일 스트림은 파일과 상호작용하고 처리하는 C++ 객체로, 파일 스트림이 파일을 여는데 사용되면 그 스트림에 수행된 모든 입/출력 작업이 물리적으로 파일에 반영된다.

C++ 언어는 스트림들과 동작하기 위해 표준 iostream 클래스와 파일과 관련해서는 ofstream, ifstream, fstream 클래스와 기능을 라이브러리 형태로 제공한다.

iostream은 다음과 같은 요소들을 포함한다.

  • 기본 클래스 템플릿: iostream의 기본은 클래스 템플릿 계층이다. 클래스 템플릿은 유형에 관계없이 라이브러리의 대부분의 기능을 제공한다.
  • 클래스 템플릿 인스턴스화: 라이브러리는 전체 iostream 클래스 템플릿 계층의 char_twchar_t의 두 가지 표준 인스턴스화 집합이 통함된다. char은 narrow-oriented 이고 w_char은 wide-oriented 이다.
  • 클래스 템플릿 인스턴스화: 라이브러리는 전체 iostream 클래스 템플릿 계층의 char_twchar_t의 두 가지 표준 인스턴스화 집합이 통함된다.
  • 표준 객체: <iostream>헤더파일은 iostream 라이브러리의 일부로 표준 입출력에서 입력과 출력 작업을 수행하는데 사용되는 특정 객체를 선언한다.
  • 자료형: iostream 클래스는 멤버의 프로토타입에 기본 자료형을 사용하지 않는다. 일반적으로 인스턴스화에 사용된 특성에 따라 정의된 유형을 사용한다. 기본 char_twchar_t 인스턴스화에 대해서 streampos, streamoff, streamsize 유형이 각각 위치, 오프셋, 크기를 표현할 때 사용된다.
  • 조작자(Manipulators): iostream 객체에 실행되는 연산자인 삽입(insertion)(<<) 및 추출(extraction)(>>) 연산자들과 함께 사용되도록 설계된 전역 함수로 일반적으로 스트림의 속성과 형식 설정 변경을 한다. 조작자의 예로는 endl, hex, scientific등 이 있다.