C++은 stream을 이용해서 스크린에 표시되는 미디어를 보여준다.
stream은 프로그램으로부터, 또는 프로그램에 글자를 넣고 뺄 수 있게 해주는 장치이다.
스트림은 문자들의 목적지이자 source라는 것을 알고 있으면 된다.
스탠다드 라이브러리는 프로그램이 실행되는 환경에서 필요한 것으로 생각되는 소스들을 가지고 있다.
그 예로는 cin(input), cout(output), cerr(error), clod(logging output)이 있다.
대부분의 프로그래밍 환경에서 standard output은 화면에 표시되는 디폴트이다. C++ 스트림에서는 cout을 standard output으로 이용한다.
cout은 << 오퍼레이터를 끼워넣어서 사용한다. << 오퍼레이터는 그 뒤에 오는 데이터를 앞의 스트림에 삽입한다.
아래 코드에서 cout은 Output sentence 다음에 x의 값을 스트림에 삽입한다.
cout << "Output sentence \n";
cout << x;
//결과: 문자열 "Output sentence \n"와 x의 값을 출력한다.
대부분의 프로그래밍 환경에서 standard input은 키보드가 기본이다. 그리고 C++ 스트림은 standard input에 cin으로 접근하도록 정의해두었다.
cin은 추출 오퍼레이터인 >>과 함께 쓰인다. 입력 추출 오퍼레이터 >>은 어떻게 입력에서 읽어온 값을 해석해서(타입) 전달할지 결정한다. (string인지, int인지, 등등...)
int age;
cin >> age;
위 코드는 정수 변수 age를 선언하고 사용자로부터 cin을 이용해 입력을 받아 age 변수에 저장한다.
cin으로 입력을 받을 때, cin은 사용자가 엔터 키를 누르면 입력이 끝난 신호로 받아들인다. 한 번 입력 신호가 전달되면, 프로그램은 어떠한 입력이 들어올 때까지 기다리게 된다.
만약 기대하고 있던 입력 변수의 타입과 실제 입력이 다른 경우 입력이 실패하게 된다.
입력을 할 때 여러개의 값을 입력받을 수도 있다.
cin >> a >> b;
와
cin >> a;
cin >> b;
는 같은 내용이다. 변수 a의 입력이 완료된 후, 사용자가 변수 b의 값을 차례로 입력하게 되는 프로그램이다.
이 때 두 값을 구분하는 데에는 모든 종류의 공백문자(개행문자, 스페이스, 탭)가 사용된다.
표준 헤더
<sstream>
은 stringstream이라는 타입을 정의해서 string이 스트림으로 다루어질 수 있도록 한다. 그리고
스트링 입출력을 cin과 cout에서 다루는 것과 같은 방식으로 할 수 있도록 해준다.
이 기능은 string이 숫자 값으로, 또는 그 반대로 변환되는 것에 있어서 편의를 제공한다.
string mystr ("1204");
int myint;
stringstream(mystr) >> myint;
이 코드에서 1204로 선언된 문자열이 세 번째 줄에서 myint라는 변수에 문자열에서 추출된 값이 1204라는 숫자로 바뀌어서 저장되게 된다.
int main (){
string mystr;
float price =0;
int quantity =0;
cout << "Enter price : ";
getline(cin, mystr);
cout << "Enter quantity: ";
getline (cin,mystr);
stringstream(mystr) >> quantity;
cout << "Total price: " << price*quantity << ' ';
return 0;
}
위 코드에서는 표준 입력에 들어온 스트링을 숫자로 변환해서 받고 있다.
입력을 받는 오퍼레이터는
string mystr
cin >> mystr
으로 문자열을 입력받을 수 있다.
그러나 cin을 사용하면 언제나 공백문자 (space, tabs, newline)가 나오면 입력을 종료하고 입력된 것을 추출해간다. 그래서 띄어쓰기가 포함된 절이나 긴 문장을 가져갈 수가 없다.
cin에서 완전히 문장 하나를 통으로 가져오고 싶으면 getline이라는 함수를 쓰면 된다.
#include <iostream>
#include string
using namespace std;
int main(){
string mystr;
cout << "what's your name?";
getline(cin, mystr); //입력을 받아서 mystr에 저장.
cout << "Hello" << mystr << ", nice to meet you.";
return 0;
}
보통 유저들은 프로그램이 자신의 인풋을 엔터를 누르기 전까지는 받고 있을 것이라고 기대한다. 이러한 기대를 getline을 이용해서 콘솔 프로그램에 적용시킬 수 있다.
따라서 웬만하면 유저의 입력값을 받을 때는 cin 보다는 getline을 활용하는 게 바람직하다고 볼 수 있다.