<3> namespace (네임스페이스)
출처 : http://kks227.blog.me/60204955407
(1) namespace, using, ::
- C++ 에서 새로 도입된 개념인 이름공간(namespace)
- namespace 라는 키워드를 사용한다.
- namespace 네임스페이스명 { ... } 형태를 취한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | #include <cstdio> namespace ns { int n = 5; double f = 3.3; char c = 'G'; } int k = 10; int main() { // n = 3; // Error ns::n = 3; printf("%d\n", ns::n); // 3 int n = 5; printf("%d %d\n", n, ns::n); // 5 3 using ns::f; using ns::c; //using ns::n; printf("%lf %c\n", f, c); // 3.300000 G using namespace ns; // directive printf("%d %lf %c\n", n, f, c); // 5 3.300000 G int k = 3; printf("%d %d\n", k, ::k); // 3 10 } | cs |
>> 3 : ns 라는 이름공간 생성
>> 13 : n 은 메인함수에서 선언되지 않은 변수 이므로 에러
>> 18 : main() 의 n 과 ns 라는 이름공간의 n
>> 20, 21 : 이름 공간의 변수를 이름공간을 생략하고 사용할 수 있다. (using 키워드 사용)
>> 22 : 이미 같은 이름의 변수가 지역적으로 선언되어 있으면, 컴파일 에러 발생
error: target of using declaration conflicts with declaration already in scope
>> 25 : 이름공간 ns 에 있는 변수들을 ns:: 없이 사용 가능.
다만 이미 선언되어 있는 변수의 경우 무시되는 듯 하다. 27에서 n 의 값은 main() 스코프의 n.
>> 30 : ::k 는 전역번수 k
(2) 여러개의 네임스페이스
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | #include <cstdio> namespace ns1 { int n = 11; } namespace ns2 { int n = 22; } namespace ns3 { int n = 33; namespace ns4 { int n = 44; } } int main() { printf("%d %d\n", ns1::n, ns2::n); // 11 22 /* using ns1::n; using ns2::n; printf("%d\n", n); // error!! */ { using namespace ns1; printf("%d\n", n); // 11 } { using namespace ns2; printf("%d\n", n); // 22 } printf("%d %d\n", ns3::n, ns3::ns4::n); // 33 44 return 0; } | cs |
>> 26 : n 이 어디소속인지 알 수 없으므로 에러.
>> 29 ~ 37 : 이런식으로 스코프를 중괄호를 만들어 주고, 그 안에서 독자적으로 특정 네임스페이스를 사용하는 방법도 있다고 한다.
>> 12 ~ 17, 39 : 네임스페이스 안에 네임스페이스
(3) 이름없는 네임스페이스, 네임스페이스 안의 함수
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | #include <cstdio> namespace { int n=4; } // n = 8; error!! int func() { return n; } namespace ns { void func(); } int main() { printf("%d\n", n); // 4 n = 8; printf("%d\n", n); // 8 printf("%d\n", func()); // 8 ns::func(); // called ns::func() using ns::func; // not using ns::func(); func(); return 0; } namespace ns { void func() { puts("called ns::func()"); } } | cs |
>> 3 : 이름없는 네임스페이스 선언
>> 18 : ::와 같은 연산자 없이 바로 사용 가능.
>> 7 : 하지만 전역 지역에서는 사용 불가.
>> 9 : 이와 같이 어떤 지역 스코프 안에서 사용 가능.
>> 12, 25 : 변수를 선언하고 사용하는것과 비슷하다.
>> 27 : using 키워드를 사용할 때는 using 네임스페이스명::함수이름; 의 형태로 써야한다.
>> using ns::func(); 는 잘못된 형태이다.
>> 33 : 프로토타입만 선언 후 나중에 따로 정의를 해도 된다.
'Language > C++' 카테고리의 다른 글
<2> 레퍼런스 (reference) (0) | 2018.02.12 |
---|---|
<1> C++ 에서 확장된 기능 (0) | 2018.02.12 |