8. 메모리 모델과 이름 공간(3) - 이름 공간

WanJu Kim·2022년 12월 9일
0

C++

목록 보기
37/81

프로젝트가 커짐에 따라서 변수나 함수 이름이 겹칠 가능성이 생겼다. 이 문제점을 해결할 수 있는 게 이름 공간이다. 이름 공간은 다음과 같이 사용한다.

	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 지시자를 사용할 수도 있다.

profile
Question, Think, Select

0개의 댓글