같은 반에 '지수'라는 같은 이름을 가진 학생이 두 명 있다고 상상해 보세요. 이 둘을 구분하려면 반드시 추가 정보가 필요합니다. 사는 동네가 다르다면 지역명으로, 아니면 부모님의 성함 같은 정보로 구분할 수 있겠죠.
C++ 프로그래밍에서도 똑같은 상황이 발생합니다. 예를 들어 여러분이 작성한 코드에 xyz()라는 함수가 있는데, 사용 중인 외부 라이브러리에도 똑같은 xyz() 함수가 존재한다면 어떻게 될까요? 컴파일러는 코드 안에서 호출된 xyz()가 어느 쪽 함수인지 판단할 방법이 없습니다.
바로 이런 문제를 해결하기 위해 네임스페이스(namespace)가 도입되었습니다. 네임스페이스는 서로 다른 라이브러리에 존재하는 이름이 같은 함수, 클래스, 변수 등을 구분하기 위한 추가 정보 역할을 합니다. 네임스페이스를 사용하면 이름이 정의되는 맥락(context)을 지정할 수 있으며, 본질적으로 하나의 범위(scope)를 정의하는 것이라고 할 수 있습니다.
네임스페이스 정의 방법
네임스페이스는 namespace 키워드 뒤에 네임스페이스 이름을 붙여 다음과 같이 정의합니다.
namespace namespace_name {
// 코드 선언
}네임스페이스에 속한 함수나 변수를 호출하려면 범위 지정 연산자인 ::(더블 콜론)를 사용해 네임스페이스 이름을 앞에 붙여주면 됩니다.
name::code; // code에는 변수 또는 함수가 올 수 있습니다.
네임스페이스 사용 예제
아래 예제는 서로 다른 두 네임스페이스에 같은 이름의 함수 func()를 정의하고, 각각 구분하여 호출하는 방법을 보여줍니다.
#include <iostream>
using namespace std;
// 첫 번째 네임스페이스
namespace first_space {
void func() {
cout << "Inside first_space" << endl;
}
}
// 두 번째 네임스페이스
namespace second_space {
void func() {
cout << "Inside second_space" << endl;
}
}
int main () {
// 첫 번째 네임스페이스의 함수 호출
first_space::func();
// 두 번째 네임스페이스의 함수 호출
second_space::func();
return 0;
}실행 결과
Inside first_space Inside second_space
추가로 알아두면 좋은 것: using 키워드
매번 네임스페이스이름::을 붙여 호출하는 것이 번거롭다면, using 지시문을 활용할 수 있습니다. 특정 네임스페이스를 미리 선언해 두면 이후 코드에서 접두사 없이 바로 사용할 수 있습니다.
using namespace first_space; func(); // first_space::func()와 동일하게 동작
단, 여러 네임스페이스를 동시에 using으로 열어두면 오히려 이름 충돌이 다시 발생할 수 있으므로, 실무에서는 필요한 범위에서만 신중하게 사용하는 것이 좋습니다.