네임스페이스

2019. 8. 20. 00:11PL/C++

함수 이름과 매개변수 형식이 같을 때 이를 구분해줄 수 있도록 하는 것이 namespace 이름공간이다

 

참고로 전역변수도 ::으로 표시할 수 있다. 전역변수이기 때문에, namespace는 명시하지 않아도 된다

#include <iostream>

using namespace std;

int n;
void set() {
	::n = 10;
}

namespace A {
	int n;
	void set() {
		n = 20;
	}
}

namespace B {
	int n;
	void set() {
		n = 30;
	}
}

int main(void) {
	::set();
	A::set();
	B::set();
	
	cout << ::n << '\n';
	cout << A::n << '\n';
	cout << B::n << '\n';
 	return 0;
}

 

namespace는 어디서든지 재정의 할 수 있다. 두 가지 방법이 있다

 

#include <iostream>

using namespace std;

int n;
void set() {
	::n = 10;
}

namespace A {
	int n;
	void set();
}

namespace B {
	int n;
	void set();
}

int main(void) {
	::set();
	A::set();
	B::set();
	
	cout << ::n << '\n';
	cout << A::n << '\n';
	cout << B::n << '\n';
 	return 0;
}

namespace A {
	void set() {
		n = 20;
	}
}

void B::set() {
	n = 30;
}

 

namespace 안에 namespace를 정의할 수 있다. 그리고 반드시 함수보다 변수를 위에 작성하는 습관을 들이는 것이 좋다

 

#include <iostream>

using namespace std;

int n;
void set() {
	::n = 10;
}

namespace A {
	int n;
	void set() {
		n = 20;
	}
	
	namespace B {
		int n;
		void set() {
			n = 30;
		}
	}
}

int main(void) {
	::set();
	A::set();
	A::B::set();
	
	cout << ::n << '\n';
	cout << A::n << '\n';
	cout << A::B::n << '\n';
 	return 0;
}

 

위와 똑같이 밖에서 정의할 수 있다

 

#include <iostream>

using namespace std;

int n;
void set() {
	::n = 10;
}

namespace A {
	int n;
	void set();
	
	namespace B {
		int n;
		void set();
	}
}

int main(void) {
	::set();
	A::set();
	A::B::set();
	
	cout << ::n << '\n';
	cout << A::n << '\n';
	cout << A::B::n << '\n';
 	return 0;
}

void A::set() {
	n = 20;
}

void A::B::set() {
	n = 30;
}