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();
}
귀여운 그림은 낡은 창고님이 그리셨습니다.
'C++' 카테고리의 다른 글
[C++] 가상 소멸자 (0) | 2022.07.02 |
---|---|
[C++] 동적 바인딩, 정적 바인딩 (1) | 2022.06.30 |
[C++] friend 키워드 (2) | 2022.06.23 |
[C++] 객체 배열 생성 및 소멸 (Java와 다른점) (0) | 2022.06.22 |
[C++] C++에서 C 라이브러리 표기법 (0) | 2022.06.22 |