'윤성우의 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 }
===============================================================================================
이름 공간에 관한 예제 소스 코드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함수 밑에서 정의를 하였습니다.
이런식으로 코딩을 해도 됩니다. 이름 공간만 잘 구별하여서 사용하면 만사 오케이!!!