이번 강좌에서는 C++에서 각각 입력과 출력을 담당하는 cin, cout 객체에 대해서 알아보도록 할 것입니다. 강좌를 시작하기 전에, 이 강좌는 첫 강좌에서 말씀드렸듯이 C를 알고 있다는 전제하에 강좌를 진행합니다. 추후에, C 강좌와 C++ 강좌를 분리하여 C를 모르더라도 C++만 배울 수 있도록 강좌를 재구성시킬 예정에 있습니다. 자료형에 대해서 아직 잘 모르신다면, 이 강좌를 읽기 전 이곳을 참조하시는 것이 좋습니다.


1. cout (console out)

먼저, cout 객체 부터 보도록 할텐데, 제일 처음 만나볼 cout 객체는 C언어의 출력 함수인 printf()와 흡사합니다. 바로 보도록 할까요? 아래 예제 코드를 따라 작성하여, Ctrl+F5를 누르거나 '디버그(D)->디버그 하지 않고 시작(H)'을 눌러 결과를 확인해보도록 합시다.

#include <iostream>

int main()
{
	std::cout << "Hello, world!" << std::endl;

	return 0;
}

결과:

Hello, world!

계속하려면 아무 키나 누르십시오 . . .

1행부터 살펴보면, C에서 사용되는 stdio.h와는 달리, C++에서는 iostream이란 헤더가 등장합니다. iostream은 Input/Output Stream(입출력 스트림)에서 이름을 따온 것으로, C의 stdio.h와 비슷한 역할을 담당하고 있습니다.

  헤더 파일의 이름이 조금 이상합니다. iostream이 아니라 iostream.h이 아닌가요? 

C에서는 stdio.h나 stdlib.h과 같이 헤더 파일임을 명시하기 위해 확장자 .h를 붙인 이름을 포함시켰습니다. 1998년에 C++ 표준(ISO/IEC 14882;1998)이 정해지기 전에는 iostream.h 형태의 C++ 헤더 파일을 포함시킬 수 있었습니다. 그러나, 1998년에 표준안이 확립되고 그 이후에 만들어진 컴파일러는 표준 규격을 준수하고 있으며 C++ 표준 라이브러리의 확장자 .h를 제거하여 헤더를 제공하게 되었습니다. 이렇게 확장자가 제거된 헤더를 제공하는 이유는 과거의 표준 라이브러리와 새로운 표준 라이브러리를 구분하기 위해서라고 합니다.

이제, 4행을 한번 봅시다. 살펴보면, std은 또 뭐고, ::와 <<란 것이 어디서 튀어나왔는지, 마지막의 endl는 무엇을 의미하는 것일까요? 


먼저, std은 네임스페이스(namespace)라는 것으로 다음 강좌에서 이 네임스페이스가 왜 필요한지, 어떻게 정의하고 사용하는지 등에 대해서 자세히 설명하고 있습니다. 궁금하신 분들은 먼저 다음 강좌를 보시고 오셔도 괜찮습니다. 우선은 이번 강좌에서 만나볼 cout, cin와 endl를 쓰기 위해서는 앞에 std::를 붙일 필요가 있다는 것만 알아두도록 합시다.


위의 예제에서 등장하는 <<는 연산자 오버로딩에 의해 기능이 재정의된 것으로, 나중에 연산자 오버로딩을 설명할 때 자세히 설명해 드리도록 하겠습니다. 여기서는 << 연산자가 C의 시프트 연산자와 동일한 기능을 하는 것이 아니라, 오른쪽에 오는 문자나 숫자 등의 데이터를 출력하기 위해 사용된다고 알아둡시다. 잘 감이 안온다면, C의 printf()와 비교를 해보도록 합시다. 아래의 예제를 같이 살펴봅시다.

std::cout << "저의 이름은 " << name << "입니다.";
printf("저의 이름은 %s입니다.", name);

위에 작성된 두 코드는 완전히 동일한 결과를 내보냅니다. 물론, C에서는 %s와 같이 포맷 지정을 해주어야 했지만 C++의 경우는 그냥 변수명만 끼워넣어도 그 변수의 형식에 맞추어 출력됩니다. name이 문자열이면 문자열로, 실수면 실수로, 정수면 정수의 형태로 말입니다. 상당히 편리하죠?


마지막으로 endl은 C에서의 \n(개행, newline)과 같습니다. 아래의 예제를 통해서, endl의 유무에 따라 결과값이 달라지는 것을 확인하실 수 있습니다. endl이 없다면, 다음 줄로 건너뛰지 않고 이어서 출력되는 모습을 볼 수 있습니다.

#include <iostream>

int main()
{
	std::cout << "Hello, World!";
	std::cout << "Hello, World!" << std::endl;

	return 0;
}
결과:

Hello, World!Hello, World!

계속하려면 아무 키나 누르십시오 . . .

2. cin (console input)

이번에는 입력을 담당하는 cin라는 녀석에 대해서 알아보도록 하겠습니다. 이 역시, 예제를 먼저 보고 설명하도록 하겠습니다.

#include <iostream>

int main()
{
	char name[10];

	std::cin >> name;
	std::cout << "당신의 이름은 " << name << "입니다." << std::endl;

	return 0;
}

결과:

김철수

당신의 이름은 김철수입니다.

계속하려면 아무 키나 누르십시오 . . .

5행을 보면 크기 10의 char형 배열인 name이 선언되었습니다. 주목하셔야 할 부분은 그 다음 부분입니다. 7행을 보시면 cin가 등장한 것을 볼 수 있는데, cout와는 달리 시프트 연산자의 방향이 반대입니다. cin은 사용자로부터 입력받은 값을 >> 연산자의 오른쪽에 위치한 변수에 저장합니다. 이것 역시도, C의 입력 함수 scanf()와 달리 형식을 지정하지 않아도 됩니다. 예제 하나를 더 살펴보도록 합시다.

#include <iostream>

int main()
{
	char name[10];
	int age;

	std::cin >> name >> age;
	std::cout << "당신의 이름은 " << name << "이며, 나이는 " << age << "살입니다." << std::endl;

	return 0;
}

결과:

김철수 14

당신의 이름은 김철수이며, 나이는 14살입니다.

계속하려면 아무 키나 누르십시오 . . .

아까와 달라진 게 있다면, 8행을 보시면 연이어 입력을 받고 있습니다. 8행의 코드는 아래의 코드와 동일한 기능을 수행합니다.

// std::cin >> name >> age;와 동일
std::cin >> name;
std::cin >> age;

데이터 입력의 기준은 스페이스바, 탭, 엔터키와 같은 공백에 의해서 나뉩니다. 결과를 보시면 알겠지만, '김철수'가 name에, '14'가 age에 들어간 것을 확인하실 수 있습니다.


여기까지, C++에서 입력과 출력은 어떻게 하는지에 대해 간단하게 살펴보았습니다. 이번 강좌는 여기까지 쓰도록 하겠습니다. 여기까지 읽느라 모두 수고하셨습니다.


다음 강좌부터는 네임스페이스(namespace)에 대해 배우도록 하겠습니다.