프로젝트가 커짐에 따라서 변수나 함수 이름이 겹칠 가능성이 생겼다. 이 문제점을 해결할 수 있는 게 이름 공간이다. 이름 공간은 다음과 같이 사용한다.
name space Jack
{
double pail;
void petch();
struct Well {...}
}
name space Jill
{
double pail;
void petch();
struct Well {...}
}
int main()
{
...
}
특징은 코드 블럭 외부에서 선언을 해야 한다. 접근은 어떻게 하는가? 범위 연산자를 통해서 하면 된다.
Jack::pail;
Jill::pail; // 이 둘은 다르다.
각각 Jack 이름 공간 안에 있는 pail 변수, Jill 이름 공간 안에 있는 pail 변수이다. 만약 'Jack::'이 문구를 치기 귀찮은가? 두 가지 방법이 있다. using 선언과 using 지시자를 이용하면 된다. using 선언은 다음과 같이 이용한다.
using Jack::pail; // using 선언.
이렇게 쓰면 앞으로는 지역 변수 취급하겠다는 거다. 따라서 지역 변수 처럼 'pail' 이렇게 쓰면 된다.
namespace Jill
{
double fetch;
}
char fetch; // 전역 변수.
int main()
{
using Jill::fetch; // 이제 지역 변수 취급.
double fetch; // 에러. 이미 정의되어있다.
cin >> fetch;
cin >> ::fetch; // 전역 변수.
}
만약 using 선언을 코드 외부에 놓는다? 바로 전역 변수 취급해준다.
void other();
namespace Jill
{
double fetch;
}
using Jill::fetch; // 이제 전역 변수 취급.
int main()
{
cin >> fetch; // 전역 변수 취급.
other();
}
void other()
{
cout << fetch; // 전역 변수 취급.
}
지금까지 using 선언을 알아보았고, 이는 한번에 하나의 이름만 사용할 수 있게 만든다. 이와는 대조적으로 using 지시자는 모든 이름을 사용 가능하게 만든다. 다음과 같이 사용한다.
using namespace Jill; // Jill 이름 공간에 있는 변수들을 범위 연산자 없이 쓸 수 있다!
우리는 이 문구를 많이 봐왔다.
using namespace std;
이것도 마찬가지로 코드 블럭 내외부에 사용함에 따라 사용 범위가 다르다.
using 선언과 using 지시자는 잘 사용해야 한다. 그렇지 않다면 충돌이 일어나서 사용한 의미가 사라진다.
using Jack::val;
using Jill::val;
val = 4; // 어떤 이름 공간의 val인가?
namespace elements
{
namespace fire
{
int flame;
}
float water;
}
이 경우에는 당황하지 말고 flame 변수를 elements::fire::flame을 통해 접근하면 된다. 혹은
using namespace elements::fire;
이렇게 using 지시자를 사용할 수도 있다.