Media Log


이번 강좌에서는 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)에 대해 배우도록 하겠습니다.


  1. at 2012.10.25 21:24 [edit/del]

    비밀댓글입니다

    Reply
  2. Mandu at 2012.12.25 22:51 신고 [edit/del]

    강좌 잘 봤습니다.
    근데,
    return 0 을
    return 1 로
    바꾸어도 별 차이는 없던데요?
    (#include <stdlib.h>와 system("pause"); 를 추가해서 알수있었습니다.

    Reply
    • BlogIcon EXYNOA at 2012.12.26 17:27 신고 [edit/del]

      하나의 약속입니다. 문제가 없이 프로그램이 정상 동작하면 0을 반환하고, 문제가 있으면 0이 아닌수, 예를 들어 1, -1, 2.. 등을 반환하도록 약속이 되어 있습니다.

  3. d1 at 2014.06.01 22:06 신고 [edit/del]

    저어 hello, world관한거
    다쳤는데요
    어떻게 나타나게해요?> 디버깅??그거안되는데 ㅠ

    Reply
    • BlogIcon EXYNOA at 2014.06.01 23:53 신고 [edit/del]

      디버깅 키는 F5 입니다. 그리고 디버깅 하지 않고 실행은 Ctrl+F5 입니다. 왠만하면 Ctrl+F5 단축키를 이용하셔서 결과를 확인하세요.

  4. ㅠㅠ at 2014.07.29 17:08 신고 [edit/del]

    디버깅을해도 지정된 파일을찾을수없다고 오류가뜨네요

    Reply
    • BlogIcon EXYNOA at 2014.08.02 23:16 신고 [edit/del]

      설정된 작업 디렉토리에 해당 파일이 있는지 확인해보세요. 그리고 코드를 다시 확인해보시거나, 다른 방법으로도 해결이 안 될 경우에는 재설치가 필요할듯 싶습니다.

  5. DEV at 2016.07.24 16:36 신고 [edit/del]

    int age;는 무슨 역할을해주는건가요

    Reply
    • 행인 at 2016.07.29 15:45 신고 [edit/del]

      std::cin>>name>>age;

      입력을 받는거에요

      '김철수 14' 라고 입력을 하면
      김철수는 name이라는 변수에, 14는 age란 변수에 담기게 됩니다.

    • 행인2 at 2016.11.10 19:16 신고 [edit/del]

      변수 선언 입니다...
      int 형의 변수 age를 선언합니다...

  6. 지식거지 at 2016.12.06 16:31 신고 [edit/del]

    #include <iostream>

    int main()
    {
    char name[10];

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

    여기서 std::cin 에서 ::<<<이거있자나요 이게자꾸오류래요 비주얼스튜디오2015로 했는데 ㅠㅠㅠㅠㅠㅠㅠ 식이필요합니다 라고나와요 ㅠ ㅠㅠㅠㅠㅠ

    Reply
  7. ㅎㅎㅎ at 2017.11.07 19:12 신고 [edit/del]

    이제부터 학습하기 시작하네요!! 감사합니다 :> 이해가 잘되여

    Reply
  8. 안녕하세요 at 2018.01.10 01:10 신고 [edit/del]

    한글이 출력되지 않아요 ㅠ
    무슨문제일까요?

    A??Add() ?출!
    B??Add() ?출!

    Reply
  9. 다양한 형태의 입력 at 2018.04.13 17:15 신고 [edit/del]

    정수가 입력되면 array에 추가하고, 문자열 "CALCULATE"가 입력되면 array에 저장된 모든 정수를 더한 값을 반환하고, 문자열 "EXIT"가 입력되면 프로그램을 종료하는 것처럼

    여러 자료형으로 입력이 들어올 가능성이 있을 때는 어떻게 해야하나요?

    void를 자료형으로 사용해야하나요?

    Reply

submit

티스토리 툴바