(구) 자료/C

[1-5] namespace란?

뜐뜐뜐 2018. 8. 27. 17:20

1. namespace란?

- 정확히 말하면 '이름을 붙여놓은 공간'이다.

- 즉, 특정 영역에 이름을 붙여주기 위한 문법적 요소.

- 아주 쉬운 예로, 아파트 입구에서 '도랑아 놀자!' 하면 그 아파트 사는 도랑이들이 죄다 창 밖을 쳐다보겠지.

- 하지만, 301호 사는 도랑아 나와! 하면 친구 한 명만 밖을 쳐다보고 나오게 될 것이다.


* 이해가 잘 안된다. 코드를 보여달라!


1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include<iostream>
using namespace std;
 
void myFunc(void) {
    cout << "도랑이 코드" << endl;
}
void myFunc(void) {
    cout << "식혜의 코드" << endl;
}
 
int main() {
 
    return 0;
}
cs


- 위처럼 만들면, myFunc를 호출했을 때 충돌이 발생하게 된다.

- 그래서 다음과 같이 namespace를 이용해서 도랑이와 식혜의 영역을 나눠주면 된다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include<iostream>
using namespace std;
namespace 도랑 {
    void myFunc(void) {
        cout << "도랑이 코드" << endl;
    }
}
namespace 식혜 {
    void myFunc(void) {
        cout << "식혜의 코드" << endl;
    }
}
int main() {
 
    도랑::myFunc();
    식혜::myFunc();
    return 0;
}
cs


- 정상적으로 출력되는 모습을 볼 수 있을 것이다.

- 여기서 '::'는 '범위지정 연산자'라고 하는데, 이름공간을 지정할 때 사용하는 연산자이다.

- 왜 쓰냐? 동일한 namespace에 정의된 함수를 호출하는 것은 상관 없지만, 다른 공간에서 정의된 함수를 호출할 때는 명시 해줘야 함.


2. using의 의미

- using namespace std

- 그대로 번역하면 std라는 namespace를 사용하겠다.

- 즉, std라는 namespace에 정의된 모든 함수들은 '범위지정 연산자'를 이용 하지 않고, 바로 호출하겠다는 것을 명시하는 것.


3. namespace의 중첩?

- namespace가 중첩되어, 굉장히 코드가 더러워질 때가 있다. 바로 아래처럼 말이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include<iostream>
#include<stack>
using namespace std;
 
namespace AA {
    namespace BB {
        namespace CC {
            int num = 10;
        }
    }
}
 
int main() {
    cout << AA::BB::CC::num << endl;
}
cs

- 이럴땐 별명을 만들어서 사용할 수 있다. 아래처럼.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include<iostream>
#include<stack>
using namespace std;
 
namespace AA {
    namespace BB {
        namespace CC {
            int num = 10;
        }
    }
}
 
int main() {
    cout << AA::BB::CC::num << endl;
    namespace temp = AA::BB::CC;
 
    cout << temp::num << endl;
    return 0;
}
cs