Namespace 예시
- 다음 코드는 한 파일에 doSomething 함수가 동시에 2개 존재하지만 서로 다른 namespace에 존재하기 때문에 문제가 없다.
- 특정 namespace에 속한 함수를 사용하기 위해서는 <Namespace>::<func> 과 같은 방식으로 함수를 호출한다.
#include <iostream>
namespace MySpace1
{
int doSomething(int a, int b)
{
return a + b;
}
}
namespace MySpace2
{
int doSomething(int a, int b)
{
return a * b;
}
}
using namespace std;
int main()
{
cout << MySpace1::doSomething(3, 4) << endl;
cout << MySpace2::doSomething(3, 4) << endl;
return 0;
}
namespace를 여러 뎁스에 걸쳐 선언하면 중첩 namespace가 된다.
namespace MySpace1
{
namespace Inner
{
int doSomething(int a, int b)
{
return a + b;
}
}
}
(C++17 추가 사항) C++ 17에서는 중첩 namespace를 아래와 같이 한 줄에 명시할 수 있다.
namespace MySpace1::Inner
{
int doSomething(int a, int b)
{
return a + b;
}
}
중첩 namespace의 함수를 사용하기 위해서는 namespace를 모두 명시해야 한다.
int main()
{
cout << MySpace1::Inner::doSomething(3, 4) << endl;
return 0;
}
namespace 모호성
동일한 이름의 함수/변수가 존재하는 namespace를 동시에 using namespace를 적용하고 해당 함수/변수를 사용하고자 한다면 namespace간 이름이 겹치기 때문에 compile 에러가 발생한다. 이런 경우 namespace를 명시하는 식으로 구분이 필요하다.
namespace a
{
int my_var(10);
}
namespace b
{
int my_var(10);
}
int main()
{
using namespace a;
using namespace b;
std::cout << my_var << std::endl;
}
namespace a, b 내부에 모두 my_var 변수가 존재하기 때문에 오류가 발생한다.

범위 지정 연산자.
namespace에 접근할때 사용하는 :: 연산자는 범위 지정 연산자(scope resolution operator)라고 부른다.
범위 지정 연산자는 C++의 모든 연산자들 중에서 가장 우선순위가 높다.
using 키워드
using 키워드를 사용하면 namespace를 일일이 명시하지 않아도 함수를 호출할 수 있다.
int main()
{
using namespace MySpace1;
cout << doSomething(3, 4) << endl;
return 0;
}
하나의 namespace를 통째로 가져다 쓰는 것이 아니라 namespace의 일부 함수만 사용하고 싶다면 아래와 같이 명시 가능하다. namespace 키워드를 생략하고 namespace::foo 와 같은 형식으로 쓴다.
int main()
{
using std::cout; // std namespace의 일부 기능만 적용
cout << "Hello c++" << std::endl;
}
주의 사항
- 헤더 파일에 using namespace 키워드를 사용하는 것은 해당 헤더 파일을 include하는 모든 cpp 파일에 영향을 주기 때문에 가급적 지양해야 한다.
- 헤더 파일에 사용하는 것은 여건상 사용하게 될 수도 있지만 전역으로 using namespace를 사용하는것 만큼은 반드시 피하는게 좋다.