C++2011.03.06 20:33


이번 강좌에서는
  • 첫번째 C++ 프로그램 분석
  • 이름공간(namespace) 에 대한 이해



  안녕하세요 여러분~ 씹어먹는 C++ 두번째 강좌 입니다. 지난번에는 아마도 여러분 인생 최초의 C++ 프로그램을 만들어 보았을 텐데요, 이번 강좌에서는 소스 코드를 따라가면서 분석을 하는 시간을 갖도록 하겠습니다. 사실, 지금 제 강좌를 보고 계시는 분들 중에서는 막 C 언어 공부를 끝내고 오신 분들도 많으실 텐데요, 무언가 초심자의 마음으로 돌아간 것 같지 않으세요? C 언어에서 막 어려운 프로그래밍 하다가 C++ 오니 다시 맨 밑바닥 부터 화면에 출력하는 것을 하니 답답한 마음이 들 것도 같네요.. 하지만 이것도 잠시라고 생각하세요. 곧 놀라운 C++ 의 세계가 펼쳐질 것입니다.

#include <iostream>
using namespace std;

int main()
{
    cout << "Hello, World!!" << endl;
    return 0;
}


성공적으로 컴파일 하였다면


와 같이 나옵니다.

  위 코드가 바로 지난 강좌에서 사용하였던 코드 입니다. 일단 C 언어와 비슷한 점들 부터 찾아보도록 합시다. 일단 맨 위에

#include <iostream>


 을 보면 '아하! iostream 이라는 헤더파일을 include 하고 있구나!' 라는 생각이 머리속에 번뜩이셔야 합니다. 그렇지 않다면 C 언어를 다시 공부하도록 하세요 ㅎ (이 강좌를 보시면 됩니다)
iostream 헤더 파일은 C++ 에서 표준 입출력에 필요한 것들을 포함하고 있습니다. 예를 들면 아래에서 사용되는 cout 이나 endl 과 같은 것들을 말이지요. C 언어에서의 stdio.h 와 비슷하다고 보시면 됩니다. (그리고 C 와 하나 다른 점은 헤더 파일 이름 뒤에 .h 가 붙지 않습니다!)

  그 다음 줄의 using ... 을 보면 잘 모르겠네요. 일단 패스~ 그 아래를 보게 되면 다시 어디서 많이 보던 것이 나왔죠?


int main()


네. main 함수를 정의하는 부분 입니다. 그리고 그 함수의 몸체를 보면

    cout << "Hello, World!!" << endl;
    return 0;


와 같은 내용이 있네요. 화면에 대충 출력된 것을 보아 cout 은 화면에 무언가 출력시켜주는 것 같은데, printf 와 다르게 사용된 것을 보니 함수 같지는 않네요. 그리고 화면에 출력된 것을 대충 보면 "계속하려면 아무 키나 누르세요" 가 한 줄 개행되어서 나온 것을 보니 endl 은 한 줄 엔터를 쳐서 나타내라는 표시 같습니다.

그리고 마찬가지로 main 함수에서도 return 을 해주고요. 이렇게 대략 살펴보면 기존의 C 언어와 크게 다른 점은 없는 것 같습니다.

하지만 미스테리로 남아있던 부분부터 살펴보도록 합시다.


using namespace std;


위 문장을 직역해보면 'std 라는 이름 공간(namespace) 를 사용하겠다' 라는 의미가 됩니다. 그렇다면 이름 공간이란 것이 정확히 무엇일까요? 이름 공간은 말그대로 특정한 공간에 이름을 붙여준 것입니다. 예를 들어서

#include "header1.h"
#include "header2.h"

int main()
{
    function();
}


와 같은 표현을 사용했다고 합시다. 그런데 문제는 header1.h 에도 function 이 정의되어 있고, header2.h 에도 이름만 똑같이 다른 일을 하는 function 이 정의되어 있는 것입니다. 보통 C 언어에서는 이러한 문제를 해결하기 위해 우리에게 주어진 선택권은 오직 하나, 함수의 이름을 바꾸는 것 밖에 없었지만 C++ 에서는 이름 공간을 도입한 덕분에 이 문제를 유연하게 해결할 수 있었습니다. 바로 namespace 를 사용하는 것이지요.

// header1.h 의 내용
namespace header1
{
    int function();
}


// header2.h 의 내용
namespace header2
{
    int function();
}


위 둘은 각각 다른 header 들의 내용 입니다. 각각의 함수들은 다른 namespace 에 존재합니다. 즉, header1 에 있는 function 의 경우 'header1.h 에 header1 라는 이름 공간에 살고 있는 function' 이 되고, header2 에 있는 function 의 경우 'header2.h 에 header2 라는 이름 공간에 살고 있는 function' 이 되는 것이지요. 즉 기존의 C 에서는 'header1.h 에 살고 있는 function' 과 'header2.h 에 살고있는 function' 으로 밖에 나눌 수 없었지만 C++ 에서는 좀더 세부적으로 분류할 수 있게 됩니다. 따라서 실제로 main 함수에서 사용할 때는


#include "header1.h"
#include "header2.h"

int main()
{
    header1::function(); // header1 이란 이름 공간에 있는 function 을 호출
}


과 같이 사용하게 됩니다. 하지만 만일 위 같은 function 을 여러번 반복적으로 호출하게 되는 경우 어떨까요. 앞에 header1:: 을 붙이기가 상당히 귀찮게 됩니다. 그래서 아래와 같이 '나는 앞으로 header1 이란 이름 공간에 들어있는 것들만 쓸거다!' 라고 선언할 수 있습니다.

#include "header1.h"
#include "header2.h"
using namespace header1;
int main()
{
    function(); // header1 에 있는 함수를 호출
}

물론 그렇다고 해서 header2 에 있는 함수를 못 사용하는 것은 아니고 다음과 같이 지정해서 써주면 됩니다.

#include "header1.h"
#include "header2.h"
using namespace header1;
int main()
{
    header2::function(); // header2 에 있는 함수를 호출
    function(); // header1 에 있는 함수를 호출
}


그렇다면 다시 원래 예제를 살펴보도록 합시다.

using namespace std;

int main()
{
    cout << "Hello, World!!" << endl;
    return 0;
}


여기서 cout 과 endl 은 모두 iostream 헤더파일의 std 라는 이름 공간에 정의되어 있는 것들입니다. 따라서 만일 using namespace std; 를 붙여주지 않았더라면

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


로 꽤 귀찮게 써주야 했었을 것입니다. 

그렇다면 cout 은 무엇일까요? 정확히 무엇인지 말하자면 ostream 클래스의 객체로 표준 출력(C 언어에서의 stdout 에 대응됩니다) 을 담당하고 있습니다. 너무나 어렵지요. 이게 정확히 무슨 의미인지는 나중 강좌에서 알아보도록 하겠고, 그냥 다음과 같이 쓴다는 것만 알아두시면 됩니다.

cout << 출력할 것 << 출력할 것 << ... << 출력할 것;


그리고 endl 은 화면에 출력해주는 '함수' 입니다. 놀라셨지요? 하지만 그냥

cout << endl;



이라 쓰면 화면에 엔터를 하나 출력해주는 것으로 기억하시면 됩니다.
물론 endl 에 대해서도 나중에 다루어 보도록 하겠습니다 :)

생각 해보기

1. 화면에 출력되는 것들을 바꾸어보자.

2. 아래 문장은 화면에 어떻게 출력될까요?

cout << "hi" << endl << "my name is " << "Psi" << endl;

강좌를 보다가 조금이라도 궁금한 것이나 이상한 점이 있다면 꼭 댓글을 남겨주시기 바랍니다. 그 외에도 강좌에 관련된 것이라면 어떠한 것도 질문해 주셔도 상관 없습니다. 생각해 볼 문제도 정 모르겠다면 댓글을 달아주세요.

현재 여러분이 보신 강좌는<<씹어먹는 C++ - <1 - 2. 첫 C++ 프로그램 분석하기>>> 입니다. 이번 강좌의 모든 예제들의 코드를 보지 않고 짤 수준까지 강좌를 읽어 보시기 전까지 다음 강좌로 넘어가지 말아주세요





Posted by Psi

댓글을 달아 주세요

  1. 이전 댓글 더보기
  2. 무슨일이지

    저기 죄송한데요 ...
    cutrl+f5
    해도
    저 화면은안뜨고 내부 또는 외부....
    뭐라면서
    그러는데요..

    2011.03.29 23:26 신고 [ ADDR : EDIT/ DEL : REPLY ]
  3. 선언

    선언을 왜 #include <stdio.h> 이게아니고 저거인가요? .. 뭐가다른지좀알려주세여

    2011.04.16 09:13 신고 [ ADDR : EDIT/ DEL : REPLY ]
    • C++ 표준 입출력스트림입니다. 이름이 다른 이유는 그냥 이름을 다르게 지었기 때문이 아닐까요

      2011.04.24 10:22 신고 [ ADDR : EDIT/ DEL ]
  4. 또하나질문..

    친구 c++책을 빌렸는데

    이책에는 네임스페이스라는 개념차체가 없는데

    이책은 뭐죠 ?ㅜㅜ

    예를들어

    예제를보면

    #include<iostream.h>

    using namespace std; <- 이게없고

    void main()

    바로 이렇게 들어갑니다..

    줄바꿈도 endl를 안쓰고 c에서 쓰는 "역슬러쉬n"를 써요..ㅜ

    2011.06.22 23:48 신고 [ ADDR : EDIT/ DEL : REPLY ]
    • 설명하는 순서가 다른 것이겠죠..

      줄바꿈은 C++ 에서 '\n' 도 역시 지원합니다

      2011.07.03 14:43 신고 [ ADDR : EDIT/ DEL ]
    • 그건말이죠

      Psi님의 강의가 너무 좋아서 정주행 하던 도중 제가 알거 같은 내용이 나와서 한번 간섭해 봅니다 ㅋ

      실제로 C++에는 <iostream.h> 라는 표준 입출력 헤더파일이 있고, iostream 이라는 게 또 따로 있거든요.
      님이 보신 책은 iostream이 아니라 헤더파일을 썼네요.
      그래서 이름공간이 따로 필요가 없는거예요.
      이름공간 std를 쓰는 이유는 iostream.h와 iostream간의 충돌을 막기 위해 있기때문이죠.
      왜냐, iostream 안에 iostream.h가 들어있기 때문에 iostream에는 중복되는 함수가 있지만 iostream.h에는 중복되는 함수가 없기때문이죠.

      2011.07.29 10:24 신고 [ ADDR : EDIT/ DEL ]
  5. 비밀댓글입니다

    2011.07.07 17:24 [ ADDR : EDIT/ DEL : REPLY ]
    • function 에 인자를 안줘버리면 void function(int a= 0) 과 void function(void) 모두 가능하지요. 따라서 모호한 호출이므로 컴파일 오류가 발생합니다.

      2012.01.02 11:59 신고 [ ADDR : EDIT/ DEL ]
  6. son50

    질문있습니다. namespace 를 쓸 때 header1, 2 는 그냥 보면 되지만 namespae std 에서 std 는 어떻게 알고 쓰는 건지요?
    아래 댓글중에 iostream 과 iostream.h가 다르다고 나오고 iostream 안에 std 가 있는 것처럼 나오는데 두군데에서
    중복되는 std 라는 무엇 혹은 function이 존재하는 건지요? 헤더화일을 찾아봐야 하는건지요...

    2011.10.06 17:10 신고 [ ADDR : EDIT/ DEL : REPLY ]
    • C++ 표준 함수들은 모두 std namespace 안에 정의되어 있습니다. 그리고 iostream 과 iostream.h 에 차이에 관한 이야기는 http://members.gamedev.net/sicrane/articles/iostream.html 를 참조하세요 :)

      위 사이트 내용을 간단히 요약하자면 iostream.h 는 C++ 표준화 이전 버전인 구버전이고 현대의 iostream 과는 매우 다르다. 하지만 현대의 C++ 컴파일러들이 이전 소스 컴파일을 지원하기 위해서 iostream.h 를 기본적으로 지원하되, 그 파일 내용은 iostream 에 using namespace std; 가 자동으로 포함되어 있는 것과 동일하다.. 정도의 이야기가 될 것 같습니다.

      2012.01.02 12:04 신고 [ ADDR : EDIT/ DEL ]
  7. 이번 학기에 C언어 수업 마치고 PSi님 강의 들어보는데 완전 대박..... 요점만 딱딱 완전 행복해요 ㅎㅎ

    2012.06.21 00:59 신고 [ ADDR : EDIT/ DEL : REPLY ]
  8. endl 대신 \n도 되는군요 - visual studio ultimate 2013

    2013.12.17 12:00 신고 [ ADDR : EDIT/ DEL : REPLY ]
    • 네; 사실 endl 과 \n 문자로 개행하는 것은 약간 다르지만 아무튼 화면에 출력되는 것은 동일합니다.

      2014.02.18 07:06 신고 [ ADDR : EDIT/ DEL ]
  9. ddf

    endl; 이 한줄엔터이라고 했으니 위 예제의 답은
    hi 한줄 띄우고
    my name is psi 가 나오겠군요

    2013.12.30 14:40 신고 [ ADDR : EDIT/ DEL : REPLY ]
  10. 생초보

    안녕하세요~ 얼마전 질문 많이 드렸던 생초보입니다.
    C언어 배우려고 인터넷 검색해서 처음 이곳에 왔을때는 몰랐습니다.
    다른 관점에서 한번 더 공부해 보고싶어서 다른 모사이트 잠시 다녀왔는데,
    그동안 Psi님이 얼마나 한줄한줄 친절하게 설명해 주신건지 뼈저리게 느꼈습니다.
    그곳에서는 간단히 기본 개념만 설명하고, 이렇게 썼다 저렇게 썼다가 모르는 표현 투성이인데
    처음 보는 표현이 나와도 아무런 언급이 없어서 이해하기가 너무 힘들더라구요.
    다시한번 친절한 강의에 감사 드립니다. 많은 도움을 받고 있구요,
    앞으로도 좀 엉뚱한(?) 질문을 해도 잘 부탁 드리겠습니다.
    새해 복 많이 받으세요.

    2014.01.03 11:34 신고 [ ADDR : EDIT/ DEL : REPLY ]
  11. 비밀댓글입니다

    2014.04.29 20:47 [ ADDR : EDIT/ DEL : REPLY ]
  12. 비밀댓글입니다

    2014.07.07 23:59 [ ADDR : EDIT/ DEL : REPLY ]
  13. jinwoo

    "my name is " << "Psi" <<
    왜 그냥 안쓰고 <<을 사용해하는 거예요?

    2015.09.04 15:01 신고 [ ADDR : EDIT/ DEL : REPLY ]
  14. anonymouseid

    \n 과 endl 과 무엇이 다른겁니까

    2015.10.22 17:21 신고 [ ADDR : EDIT/ DEL : REPLY ]
    • 같은 개행 문자지만 endl 의 경우 flush 까지 수행합니다. 나중에 입출력에 대해서 다룰 때 배우겠습니다.

      2016.07.18 21:21 신고 [ ADDR : EDIT/ DEL ]
  15. <1번 문제>

    cout << "Welcome, C++ world!" << endl;

    <2번 문제>

    hi
    my name is Psi

    2016.03.07 21:12 신고 [ ADDR : EDIT/ DEL : REPLY ]
  16. HamaLade

    지금 보기 시작했는데 요즘도 메일로 질문 받아 주시나요?

    2016.09.21 03:25 신고 [ ADDR : EDIT/ DEL : REPLY ]
  17. 개구리밥

    namespace는 c언어의 구조체 같은 건가요?

    2016.11.18 04:45 신고 [ ADDR : EDIT/ DEL : REPLY ]
  18. 흰토끼

    안녕하세요
    코딩후 빌드를 하고 디버깅을 하는데
    자꾸 검은색 화면이 찰나에 나타났다 사라져요
    아무 키나 누를 때 까지 멈춰 있는게 아니구요
    왜 이런지 알 수 있을까요?

    2017.10.16 10:21 신고 [ ADDR : EDIT/ DEL : REPLY ]
  19. corei7

    cmd 창이 나오자마자 사라져요

    2018.06.30 20:31 신고 [ ADDR : EDIT/ DEL : REPLY ]
  20. corei7

    cmd 창이 나오자마자 사라져요

    2018.06.30 20:31 신고 [ ADDR : EDIT/ DEL : REPLY ]
  21. 낙으네

    씹어먹는 c언어로 c를 마스터하고, c++이 필요하게 되어서 1년만에 다시 들립니다.
    이전에 자바언어를 배우면서 Programming IT같이 쉽고 자세하게 설명되어 있는 싸이트가 없어서 고생을 많이 했습니다.

    역시 이 싸이트에 들어오니까 벌써부터 배울 재미에 흥분이 되네요 :)

    열심히 할게요!! c++도 잘부탁드립니다!!

    2018.09.15 13:26 신고 [ ADDR : EDIT/ DEL : REPLY ]