프로그램이 복잡해지고 여러 라이브러리가 포함될수록 변수, 함수, 구조체, 클래스 등이 같은 이름으로 서로 충돌할 가능성이 커진다.
이러한 이름 충돌 문제를 C++에서는 네임스페이스(namespace)를 통해 해결하고 있다.
C++에서는 namespace 키워드를 사용하여 사용자가 새로운 네임스페이스를 정의할 수 있다.
네임스페이스를 정의한 후에는 해당 네임스페이스로 접근할 수 있는 방법이 필요하다.
네임스페이스에 접근하기 위해서는 범위 지정 연산자(::, scope resolution operator)를 사용하여, 해당 이름을 특정 네임스페이스로 제한하면 된다.
1번은 전역으로 변수와 함수를 선언했다. 이제 같은 변수와 함수를 가진 네임스페이스를 만들어 볼 것이다.
2번은 Foo, 3번은 Bar 라는 namespaces에 전역과 같은 변수와 함수 이름에 다른 값을 넣었다.
4번은 Muf 라는 namespace 로 만들어서 Bar 를 대입했다.
#include <stdio.h>
// 1.
int gl_var = 1;
int f(void) { return 2; }
// 2.
namespace Foo {
int gl_var = 3;
int f(void) { return 4; }
}
// 3.
namespace Bar {
int gl_var = 3;
int f(void) { return 4; }
}
// 4.
namespace Muf = Bar;
int main(void) {
printf( "gl_var: [%d]\n", gl_var);
printf( " f(): [%d]\n\n", f());
printf( "Foo::gl_var: [%d]\n", Foo::gl_var);
printf( "Foo::f(): [%d]\n\n", Foo::f());
printf( "Bar::gl_var: [%d]\n", Bar::gl_var);
printf( "Bar::f(): [%d]\n\n", Bar::f());
printf( "Muf::gl_var: [%d]\n", Muf::gl_var);
printf( "Muf::f(): [%d]\n\n", Muf::f());
// 5.
printf( "::gl_var: [%d]\n", ::gl_var);
printf( "::f(): [%d]\n\n", ::f());
return (0);
}
출력 결과를 확인해보자.
아파트마다 동 및 호수는 숫자로 나타낸다.
a는 101동 101호에 살아
b는 101동 101호에 살아
a와 b 가 같은 곳에 사는 걸로 헷갈릴 수 있다.
a는 "일산" 아파트 101동 101호에 살아
b는 "천안" 아파트 101동 101호에 살아
a와 b가 어디에 사는지 명확히 알 수 있다.
코드로 만들어보면 다음과 같을 것이다.
a = 일산::101동 101호
b = 천안::101동 101호