본문으로 바로가기

[C++]이름공간(namespace) (1)

category 프로그래밍/C++ 2017. 2. 20. 01:16
728x90
반응형
안녕하세요. letitkang입니다.

바로 포스팅 시작하겠습니다.


'윤성우의 C++ 열혈강의'을 봐 봅시다!


 

 

 



오늘의 주제는 이름공간(namespace)입니다.


c와는 다르게 c++에는 namespace가 있습니다.


쉽게말하면, 특정 공간에 이름을 붙여서 사용하기 편하도록 만들어놓은 것입니다.


즉, 구분하기 쉽도록 사용합니다. 가끔 생각드는게, 프로그래밍의 기능들은 진짜 필요에 의해서 만들어졌다고 생각합니다. 너무 편해요.


언어(프로그래밍이든, 실제 사용하는언어든)를 만든 사람은 진짜 머리가 좋은 것 같아요!


예제를 한번 살펴보겠습니다.


===============================================================================================

이름 공간에 관한 예제 소스 코드1

===============================================================================================

  1 #include <iostream>

  2

  3 void SimpleFunc(void)

  4 {

  5     std::cout<<"Letitkang1이 정의한 함수"<<std::endl;

  6 }

  7

  8 void SimpleFunc(void)

  9 {

 10     std::cout<<"Letitkang2이 정의한 함수"<<std::endl;

 11 }

 12

 13 int main(void)

 14 {

 15     SimpleFunc();

 16     return 0;

 17 }

===============================================================================================

위의 소스는 컴파일 에러가 뜹니다. 왜냐?

바로 여러분이 생각하는 그것입니다! SimpleFunc 함수가 2번 정의되어 있기 때문입니다.

이것을 namespace로 나누어서 문제를 해결해보겠습니다.

===============================================================================================

이름 공간에 관한 예제 소스 코드2

===============================================================================================

  1 #include <iostream>

  2

  3 namespace Test1

  4 {

  5     void SimpleFunc(void)

  6     {

  7         std::cout<<"Test1이 정의한 함수"<<std::endl;

  8     }

  9 }

 10

 11 namespace Test2

 12 {

 13     void SimpleFunc(void)

 14     {

 15         std::cout<<"Test2이 정의한 함수"<<std::endl;

 16     }

 17 }

 18

 19 int main(void)

 20 {

 21     Test1::SimpleFunc();

 22     Test2::SimpleFunc();

 23     return 0;

 24 }

===============================================================================================

결과

===============================================================================================

Test1이 정의한 함수

Test2이 정의한 함수

===============================================================================================


 

 

 



위의 소스는 정상적으로 출력이 됩니다. 이전 소스와는 달리 같은 이름의 함수가 다른 이름 공간에서 정의되었기 때문입니다.


위의 소스에서 사용된 ::연산자를 가리켜 '범위지정연산자'라고 합니다. 이름 공간을 지정할 때 사용합니다.


Test1, Test2는 자신만의 공간을 만들었고 함수 호출을 할때 "이름공간::함수명" 이런 형식으로 함수를 호출합니다.


예제 한개를 더 살펴보겠습니다.


===============================================================================================

이름 공간에 관한 예제 소스 코드3

===============================================================================================

  1 #include <iostream>

  2

  3 namespace Test1

  4 {

  5     void SimpleFunc(void);

  6 }

  7

  8 namespace Test1

  9 {

 10     void PrettyFunc(void);

 11 }

 12

 13 namespace Test2

 14 {

 15     void SimpleFunc(void);

 16 }

 17

 18 int main(void)

 19 {

 20     Test1::SimpleFunc();

 21     return 0;

 22 }

 23

 24 void Test1::SimpleFunc(void)

 25 {

 26     std::cout<<"Test1이 정의한 함수"<<std::endl;

 27     PrettyFunc();           // 동일 공간

 28     Test2::SimpleFunc();    // 다른 공간

 29 }

 30

 31 void Test1::PrettyFunc(void)

 32 {

 33     std::cout<<"So Happy!"<<std::endl;

 34 }

 35

 36 void Test2::SimpleFunc(void)

 37 {

 38     std::cout<<"Test2이 정의한 함수"<<std::endl;

 39 }


===============================================================================================

결과

===============================================================================================

Test1이 정의한 함수

So Happy!

Test2이 정의한 함수

===============================================================================================


그리고 한가지 말씀 드릴것이 소스코드를 눈으로 보고 결과를 짐작해보세요.


제일 좋은건 직접 입력해보는 것입니다. 저도 직접 입력하고 있어요! 아이고팔아 ㅠㅜ


위의 예제를 분석해보면 Test1, Test2라는 공간에 다가 함수를 선언만 하고, main함수 밑에서 정의를 하였습니다.


이런식으로 코딩을 해도 됩니다. 이름 공간만 잘 구별하여서 사용하면 만사 오케이!!!


 

 



오늘은 여기까지 포스팅하겠습니다. 이름공간 중요합니다!

다음 강에서는 namespace의 뒷이야기를 해보도록 하겠습니다!

읽어주셔서 감사합니다! 좋은하루 되세요~


728x90
반응형