네임스페이스가 뭔지 이제 알아야 할 때가 됬다고 생각하면 언어에 대한 이해도가 늘고 있다는 반증입니다.
네임스페이스란 개념은 대부분 언어에서 채택하고 있는 방식이기 때문입니다.
자바의 클래스나 파이썬의 모듈도 네임스페이스를 사용하고 있습니다.
여기서는 C++을 기준으로 설명하겠습니다. 원리를 알게되면 다른 언어에 적용하는 것은 어렵지 않습니다.
아래의 C++ 코드는 오류를 발생합니다. 왜일까요?
int main()
{
int myVar = 22;
int myVar = 33;
return 0;
}
같은 이름의 변수를 두번 선언하고 있습니다. 컴파일러에게 이 자체가 가능은 할 수 있죠. 어차피 컴파일러가 기계어로 변환하는 변수는 소스코드로 지은 문자열의 이름인 myVar 가 아닙니다. 0xOOOO 같은 메모리주소입니다.
그러나 사람이 쓰는 소스코드는 메모리가 아니라 myVar 와 같은 식별자로 구분해야하기 때문에 이 변수를 사용할 때 문제가 생기게 됩니다. myVar 가 두개 있는데 어떤 것인지 컴파일러는 판단이 안됩니다.
그래서 위의 코드는 컴파일 오류가 납니다.
그런데 프로그램을 만들다 보면 같은 이름의 변수를 만드는 일이 있습니다. 이런 경우 어떻게 하나요?
네임스페이스 문법을 사용합니다. 위의 경우를 다시 써보겠습니다.
namespace namespace1 {
int myVar = 22;
}
namespace namespace2 {
int myVar = 33;
}
int main()
{
cout << namespace1::myVar << endl;
cout << namespace2::myVar << endl;
return 0;
}
>> 결과값 22와 33 출력
이걸 보면 이제 이해가 됩니다. myVar 는 두개지만 상위 네임스페이스가 다르기 때문에 컴파일러는 구분할 수 있습니다.
이름이 하위로 들어간다는 점에서 클래스와 닮았는데요, 클래스를 포함할 수도 있습니다.
namespace namespace2 {
int myVar = 33;
class MyClass {
public:
int myVar = 77;
};
}
int main()
{
namespace2::MyClass myClass;
cout << myClass.myVar << endl;
return 0;
}
>> 결과값 77 출력
네임스페이스 안에 클래스를 선언하면 클래스 안의 public 의 이름이 같아도 또다른 식별자로써 사용할 수 있습니다.
타이핑을 줄이기위해서 namespace2 를 파일에 포함시켜서 사용하기도 합니다.
using namespace namespace2;
그럼 교재들의 처음 부분에 나오는 이것의 정체도 알아보겠습니다.
using namespace std;
std 라는 이름공간을 사용하겠다는 말입니다.
std에 Ctrl 클릭을 하면 기호 찾기를 진행합니다. std가 포함하는 이름들의 수가 엄청나게 많군요.
사실 이렇기 때문에 using namespace std; 보다는 자기가 사용할 이름만 가져오는게 좋습니다.
아래처럼 그때그때 사용하는 cout 이나 cin 같이 지금 필요한 함수의 이름만 가져온다면 충분합니다.
using std::cout;
using std::cin;
using std::endl;
using std::string;
std 에 포함된 수많은 이름들을 매번 다 가져올 필요가 없습니다.
변수를 짓는게 컴퓨터 프로그래머의 가장 큰 고심중에 하나입니다.
적당히 구분해서 지어야 하는데 대부분 사람들이 비슷한 생각을 하기 때문에 이름이 겹치는 경우가 많습니다.
여러 사람이 참여하는 프로젝트에서 겹칠수도 있고 혹은 std 같은 내장 라이브러리에서 가져왔는데 그 안의 이름과 내가 만든 변수와 겹칠 수 있습니다. 이런 경우 나의 변수명에 의해 라이브러리의 변수가 가리워진다면 컴파일시에는 모르다가 런타임 오류가 날 수도 있습니다.
이렇게 걸리면 헛짓거리가 큽니다. 런타임 오류는 디버거를 봐야하기 때문에 시간도 오래걸립니다.
때문에 namespace 를 사용할 때는 관리가 필요한 부분이고요.
당연한 이야기지만 필요한 namespace만 사용하는 것이 좋은 방법입니다.
C++ 네임스페이스를 사용하는 이유가 다른 언어에서도 적용됩니다. 컴파일러 입장에서 생각해보면 이해가 빠릅니다.