C++

[C++] Namespace 네임스페이스

스누징어 2021. 11. 21. 22:48

Namespace 네임스페이스

Namespace란?

* 자바에 package나, C#의 namespace를 알고 있다면, 그거랑 같다.

 

* Namespace란 클래스나 함수, 변수 등에 일정 범위를 제공한다.

  같은 범위에 있는 식별자(클래스, 함수, 변수)들은 같은 Namespace안에 있는 것이다.

 

* Namespace가 다르면, 시그니쳐(이름)가 같아도 구분할 수 있다.

  또한 분류 자체만으로 가독성이 높아지는 장점도 있다. 

 

 

namespace <네임스페이스_이름> { /* 함수, 구조체, 변수, 클래스 ... */ }

#include <iostream>
using namespace std;

namespace person1 {
	int age = 20;
	string name = "전준영";
	void print() { cout << name << "의 나이는 " << age << "이다." << endl; }
}

namespace person2 {
	int age = 24;
	string name = "조정빈";
	void print() { cout << name << "의 나이는 " << age << "이다." << endl; }
}

int main() {
	person1::print();
	person2::print();
}

* main함수에서 print()함수 이름 충돌이 일어나지 않음을 볼 수 있다.

 

 

Using 지시문

* 프로그램 전체에서 유일한 시그니쳐를 가지고 있어도, 

  Namespace를 명시하지 않으면 컴파일 오류가 난다.

 

* 자주 사용하는 Namespace의 경우, using을 사용해 생략할 수 있다.

 

* Namespace 전체가 생략할 수도 있고, 특정 하나만 생략할 수 있게도 할 수 있다.

 

#include <iostream>
using namespace std;

namespace person1 {
	int age = 20;
	string name = "전준영";
	void print() { cout << name << "의 나이는 " << age << "이다." << endl; }
}

namespace person2 {
	int age = 24;
	string job = "학생";
	string name = "조정빈";
	void print() { cout << name << "의 나이는 " << age << "이다." << endl; }
}

using namespace person1;
using person2::job;

int main() {
	print();
	person2::print();
	cout << "person2 안에 있는 직업: " << job;
}

* using namespace person1;

  person1에 있는 모든 것들은 Namespace를 생략할 수 있다.

 

* using person2::job;

  person2에서 오직 job 변수만 Namespace를 생략할 수 있다.

 

* using을 쓰면 Namespace의 장점이 사라질 수 있다.

  1. 시그니쳐 중복이 있어도 using Namespace된 요소가 유일하다면, 해당 요소로 정상 작동한다.

  2. using Namespace가 여러 개일 때  시그니쳐 중복이 일어나면, 컴파일 오류가 난다.

 

* using이 꼭 전역적으로만 사용되는 게 아니다.

  local using 지시문으로도 사용할 수 있으며, 범위의 영향을 받는다.

 

 

Global Namespace

* Namespace를 명시하지 않았다면 global namespace에 들어가게 된다.

 

* Global namespace는 그냥 <요소>로 접근해도 되지만,

  <::요소>로 표현하면 훨씬 명시적이다.

 

#include <iostream>
using namespace std;

void print() { cout << "전준영의 나이는 24이다." << endl; }

int main() {
	print();
	::print();
}

* print()와 ::print() 모두 정상 작동한다. 

  

 

중첩 Namespace

* namespace 안에 namespace를 선언할 수 있다.

 

#include <iostream>
using namespace std;

namespace outer {

	int num = 10;
	void print() { cout << "outer namespace: " << num << endl; }

	namespace inner {
		int num = 20;
		void print() { cout << "outer :: inner namespace:" << num << endl; }
	}
}

int main() {
	outer::print();
	outer::inner::print();
}

 

 

 

 

 

 

 

 

 

 

귀여운 그림은 낡은 창고님이 그리셨습니다.

반응형