-
1. 네임스페이스 사용방법
#include <iostream> using namespace std; int n; void set() { ::n = 10; //명시적 전역변수 표현방법 } namespace doodle { int n; void set() { doodle::n = 20; } } namespace google { int n; void set() { google::n = 30; } } int main() { ::set(); doodle::set(); google::set(); cout << "::n : " << ::n << endl; cout << "doodle::n : " << doodle::n << endl; cout << "google::n : " << google::n << endl; }
네임스페이스는 같은 변수명을 구분할 수 있게 해준다.
'네임스페이스명::변수명or함수명' 형식으로 쓰인다.
2. 네임스페이스 안에서 네임스페이스명:: 을 생략한 경우
#include <iostream> using namespace std; int n; void set() { n = 10; } namespace doodle { int n; void set() { n = 20; } } namespace google { int n; void set() { n = 30; } } int main() { ::set(); doodle::set(); google::set(); cout << "::n : " << ::n << endl; cout << "doodle::n : " << doodle::n << endl; cout << "google::n : " << google::n << endl; }
네임스페이스 안에서 네임스페이스 키워드를 생략하고 변수를 사용한다면 그 네임스페이스에 해당하는 지역변수로써 작용한다.
한마디로, doodle안의 n에 doodle::을 생략하여도 doodle::n으로 작용한다는 의미.
3. 네임스페이스 재정의
#include <iostream> using namespace std; int n; void set(); namespace doodle { int n; void set(); } namespace google { int n; void set(); } int main() { ::set(); doodle::set(); google::set(); cout << "::n : " << ::n << endl; cout << "doodle::n : " << doodle::n << endl; cout << "google::n : " << google::n << endl; } void set() { n = 10; } namespace doodle { void set() { n = 20; } } namespace google { void set() { n = 30; } }
C언어에서 위에서 함수를 선언하고 밑에서 함수를 정의하였듯이 네임스페이스도 위에 선언만하고 밑에서 재정의가 가능하다.
void ::set() { n = 10; } void doodle::set() { n = 20; } void google::set() { n = 30; }
재정의 할 때 위와 같이 간단하게 표현할 수도 있다.
4.네임스페이스 중첩
#include <iostream> using namespace std; int n; void set() { n = 10; } namespace doodle { int n; void set() { n = 20; } namespace google { int n; void set() { n = 30; } } } int main() { ::set(); doodle::set(); doodle::google::set(); cout << ::n << endl; cout << doodle::n << endl; cout << doodle::google::n << endl; }
네임스페이스도 for문 처럼 중첩으로 사용할 수 있다.
5. 네임스페이스 안에 찾으려는 변수가 없을 경우
#include <iostream> using namespace std; namespace doodle { int n; void set() { n = 20; } namespace google { // int n; void set() { n = 30; } } } int main() { doodle::google::set(); cout << doodle::n << endl; }
만약에 google::n이 존재하지 않는다면 상위 네임스페이스에서 n을 찾게된다.
그리고 상위 네임스페이스에도 없으면 전역변수 n을 찾게된다.
출력결과 6. using
#include <iostream> int n; void set() { n = 10; } namespace doodle { int n; void set() { n = 20; } namespace google { int n; void set() { n = 30; } } } int main() { using namespace std; // main 함수에 선언하면 main함수 안에서만 작동한다. using namespace doodle; ::set(); doodle::set(); // set()함수가 구분이 안되기 때문에 doodle::생략 불가능 google::set(); // doodle::을 생략해줘도 구분이 가능하기 때문에 생략가능 cout << ::n << endl; cout << doodle::n << endl; cout << google::n << endl; }
'C++' 카테고리의 다른 글
this 포인터 (0) 2021.12.21 클래스 = 구조체??, 접근제어지시자 (0) 2021.12.21 7부(C++ 스타일 프로그래밍) 종합문제 (0) 2021.12.21 C++ 스타일 함수 (0) 2021.12.21 C++ 스타일 기본 문법 (0) 2021.12.21