객체지향프로그래밍II(김정준) 12주차 강의내용
스트림
-
스트림(stream)
- 데이터의 흐름, 혹은 데이타를 전송하는 소프트웨어 모듈
◼ 흐르는 시내와 유사한 개념 - 스트림의 양 끝에는 프로그램과 장치 연결
◼ 보낸 순서대로 데이터 전달
◼ 입출력 기본 단위 : 바이트
- 데이터의 흐름, 혹은 데이타를 전송하는 소프트웨어 모듈
-
C++ 스트림 종류
- 입력 스트림
◼ 입력 장치, 네트워크, 파일로부터 데이터를 프로그램으로 전달하는 스트림 - 출력 스트림
◼ 프로그램에서 출력되는 데이터를 출력 장치, 네트워크, 파일로 전달하는 스트림
- 입력 스트림
C++ 입출력
- C++ 입출력 스트림은 버퍼를 가짐
- 키 입력 스트림의 버퍼
- 목적
◼ 입력장치로부터 입력된 데이터를 프로그램으로 전달하기 전에 일시 저장
◼ 키 입력 도중 수정 가능
◼ <Backspace> 키가 입력되면 이전에 입력된 키를 버퍼에서 지움 - 프로그램은 사용자의 키 입력이 끝난 시점에서 읽음
◼ <Enter> 키 : 키 입력의 끝을 의미
◼ <Enter> 키가 입력된 시점부터 키 입력 버퍼에서 프로그램이 읽기 시작
- 목적
- 스크린 출력 스트림 버퍼
- 목적
◼ 프로그램에서 출력된 데이터를 출력 장치로 보내기 전에 일시 저장
◼ 출력 장치를 반복적으로 사용하는 비효율성 개선 - 버퍼가 꽉 차거나 강제 출력 명령 시에 출력 장치에 출력
- 목적
입출력 방식
- 1. 스트림 입출력 방식(stream I/O)
◼ 스트림 버퍼를 이용한 입출력 방식
◼ 입력된 키는 버퍼에 저장
◼ <Enter>키가 입력되면 프로그램이 버퍼에서 읽어가는 방식
◼ 출력되는 데이터는 일차적으로 스트림 버퍼에 저장
◼ 버퍼가 꽉 차거나, ‘\n’을 만나거나, 강제 출력 명령의 경우에만 버퍼가 출력 장치에 출력 - 2. 저 수준 입출력 방식(raw level console I/O)
◼ 키가 입력되는 즉시 프로그램에게 키 값 전달
◼ <Backspace>키 그 자체도 프로그램에게 바로 전달
◼ 게임 등 키 입력이 즉각적으로 필요한 곳에 사용
◼ 프로그램이 출력하는 즉시 출력 장치에 출력
◼ 컴파일러마다 다른 라이브러리나 API 지원
◼ C++ 프로그램의 호환성 낮음 -
C++ 표준은 스트림 방식만 지원
◼ 스트림 입출력은 모든 표준 C++ 컴파일러에 의해 컴파일됨
◼ 높은 호환성 - 대표적인 구 표준(C++03) 입출력 라이브러리 클래스
- ios, istream, ostream, iostream, ifstream, ofstream, fstream
- 문자를 한 바이트의 char로 처리
- cin >> 로 문자를 읽을 때, 한글 문자 읽을 수 없음
◼ 영어나 기호 : 1 바이트
◼ 한글 문자 : 2 바이트
- cin >> 로 문자를 읽을 때, 한글 문자 읽을 수 없음
char ch;
cin >> ch; // 키보드로 문자 입력. 한글 문자 읽을 수 없음
- 지금도 마찬가지로 cin으로 한글을 문자 단위로는 읽을 수 없음
- 다양한 크기의 다국어 문자를 수용하기 위해, 입출력 라이브러리를 템플릿으로 작성
| 클래스 | 설명 |
|---|---|
| ios | 모든 입출력 스트림 클래스들의 기본(Base) 클래스. 스트림 입출력에 필요한 공통 함수와 상수, 멤버 변수 선언 |
| istream, ostream, iostream |
istream은 문자 단위 입력 스트림. ostream은 문자 단위 출력 스트림. iostream은 문자 단위로 입출력을 동시에 할 수 있는 스트림 클래스 |
| ifstream, ofstream, fstream |
파일에서 읽고 쓰는 기능을 가진 파일 입출력 스트림 클래스. 파일에서 읽을 때는 ifstream 클래스를, 파일에 쓸 때는 ofstream 클래스를, 읽고 쓰기를 동시에 할 때 fstream 클래스 이용 |
표준 입출력 스트림 객체
- C++ 프로그램이 실행될 때 자동으로 생겨나는 스트림
- cin
◼ istream타입의 스트림 객체로서 키보드 장치와 연결 - cout
◼ ostream타입의 스트림 객체로서 스크린 장치와 연결 - cerr
◼ ostream타입의 스트림 객체로서 스크린 장치와 연결
◼ 오류 메시지를 출력할 목적
◼ 스트림 내부 버퍼 거치지 않고 출력 - clog
◼ ostream타입의 스트림 객체로서 스크린 장치와 연결
◼ 오류 메시지를 출력할 목적
◼ 스트림 내부에 버퍼 거쳐 출력
- cin
포맷 입출력
- C++에서도 입출력 시 포맷 지정 가능
- C 언어의 printf()와 유사
- 포맷 입출력 방법 3 가지
- 포맷 플래그
- 포맷 함수
- 조작자
포맷 플래그
- 입출력 스트림에서 입출력 형식을 지정하기 위한 플래그
| 플래그 | 값 | 의미 |
|---|---|---|
| ios::skipws | 0x0001 | 입력시 공백 문자(스페이스, 탭, 개행문자)를 무시 |
| ios::unitbuf | 0x0002 | 출력 스트림에 들어오는 데이터를 버퍼링하지 않고 바로 출력 |
| ios::uppercase | 0x0004 | 16진수의 A~F, 지수 표현의 E를 대문자로 출력 |
| ios::showbase | 0x0008 | 16진수이면 0x를, 8진수이면 0을 숫자 앞에 붙여 출력 |
| ios::showpoint | 0x0010 | 실수 값에 대해, 정수 부분과 더불어 소수점 이하의 끝자리들을 0으로 출력 |
| ios::showpos | 0x0020 | 양수에 대해 + 기호 출력 |
| ios::left | 0x0040 | 필드를 왼쪽 맞춤(left-align) 형식으로 출력 |
| ios::right | 0x0080 | 필드를 오른쪽 맞춤(right-align) 형식으로 출력 |
| ios::internal | 0x0100 | 부호는 왼쪽 맞춤으로 숫자는 오른쪽 맞춤으로 출력 |
| ios::dec | 0x0200 | 10진수로 출력. 디폴트 설정 |
| ios::oct | 0x0400 | 8진수로 출력 |
| ios::hex | 0x0800 | 16진수로 출력 |
| ios::scientific | 0x1000 | 실수에 대해 과학 산술용 규칙에 따라 출력 |
| ios::fixed | 0x2000 | 실수에 대해 소수점 형태로 출력 |
| ios::boolalpha | 0x4000 | 설정되면, 논리값 true를 "true"로, false를 "false"로 출력하고, 설정되지 않으면, 정수 1과 0으로 출력 |
- 포맷 플래그를 세팅하는 멤버 함수
cout.unsetf(ios::dec); // 10진수 해제
cout.setf(ios::hex); // 16진수로 설정
cout.setf(ios::dec | ios::showpoint); // 10진수 설정, 소수점 이하 0으로 출력
조작자
- manipulator, 스트림 조작자(stream manipulator)
- 조작자는 함수
◼ C++ 표준 라이브러리에 구현된 조작자 : 입출력 포맷 지정 목적
◼ 개발자 만의 조작자 작성 가능 : 다양한 목적
◼ 매개 변수 없는 조작자와 매개 변수를 가진 조작자로 구분 - 조작자는 항상 « 나 » 연산자와 함께 사용됨
| 조작자 | I/O | 용도 |
|---|---|---|
| endl | O | 스트림 버퍼를 모두 출력하고 다음 줄로 넘어감 |
| oct | O | 정수 필드를 8진수 기반으로 출력 |
| dec | O | 정수 필드를 10진수 기반으로 출력 |
| hex | O | 정수 필드를 16진수 기반으로 출력 |
| left | O | 왼쪽 맞춤으로 출력 |
| right | O | 오른쪽 맞춤으로 출력 |
| fixed | O | 실수 필드를 고정 소수점 방식으로 출력 |
| scientific | O | 실수 필드를 과학 산술용 방식으로 출력 |
| flush | O | 스트림 버퍼 강제 출력 |
| showbase | O | 16진수의 경우 0x로, 8진수의 경우 0을 앞에 붙여서 출력 |
| noshowbase | O | showbase 지정 취소 |
| showpoint | O | 실수 값에 대해, 정수 부분과 소수점 이하의 끝자리 이후 남은 공간을 0으로 출력 |
| noshowpoint | O | showpoint 지정 취소 |
| showpos | O | 양수인 경우 + 부호를 붙여 출력 |
| skipws | I | 입력 스트림에서 공백 문자를 읽지 않고 건너뜀 |
| noskipws | I | skipws 지정 취소 |
| boolalpha | O | 불린 값이 출력될 때, "true" 혹은 "false" 문자열로 출력 |
| 조작자 | I/O | 용도 |
|---|---|---|
| resetioflags(long flags) | IO | flags에 지정된 플래그들 해제 |
| setbase(int base) | O | base를 출력할 수의 진수로 지정 |
| setfill(char cFill) | O | 필드를 출력하고 남은 공간에 cFill 문자로 채움 |
| setioflags(long flags) | IO | flags를 스트림 입출력 플래그로 설정 |
| setprecision(int np) | O | 출력되는 수의 유효 숫자 자리수를 np개로 설정. 소수점(.)은 별도로 카운트 |
| setw(int minWidth) | O | 필드의 최소 너비를 minWidth로 지정 |
사용자 정의 조작자 함수 원형
- 매개변수 없는 조작자의 경우
istream& manipulatorFunction (istream& ins)
ostream& manipulatorFunction (ostream& outs)
삽입 연산자(<<)
- insertion operator, 삽입자라고도 부름
◼ << 연산자는 C++의 기본 연산자 : 정수 시프트 연산자 - ostream 클래스에 중복 작성되어 있음
- 사용자 삽입 연산자 만들기
- 개발자가 작성한 클래스의 객체를 << 연산자로 출력
추출 연산자(>>)
- extraction operator
◼ >> 연산자는 C++의 기본 연산자 : 정수 시프트 연산자 - ostream 클래스에 중복 작성되어 있음
- 추출 연산자의 실행 과정
◼ 삽입 연산자의 실행 과정과 유사하므로 생략 - 사용자 추출 연산자 만들기
- 개발자가 작성한 클래스의 객체에 >> 연산자로 입력