[C++] 01 - 5 : 이름공간(namespace)에 대한 소개
2023. 3. 13. 20:45ㆍChlln's Code/C++
이름공간의 기본원리
NameSp1.cpp
#include <iostream>
using namespace std;
namespace BestComImpl {
void SimpleFunc(void) {
cout << "BestCom이 정의한 함수" << endl;
}
}
namespace ProgComImpl {
void SimpleFunc(void) {
cout << "ProgCom이 정의한 함수" << endl;
}
}
int main(void) {
BestComImpl::SimpleFunc();
ProgComImpl::SimpleFunc();
return 0;
}
- 4~8행 : BestComImpl이라는 이름의 공간을 마련하였다.
그리고 그 안에 함수 SimpleFunc를 정의하였다.
따라서 이 함수는 'BestComImpl::SimpleFunc'이라고 지칭하게 된다. - 10~14행 : ProgComImpl이라는 이름의 공간을 마련하였다.
그리고 그 안에 함수 SimpleFunc를 정의하였다.
따라서 이 함수는 'ProgComImpl::SimpleFunc'이라고 지칭하게 된다. - 17행 : 이름공간 BestComImpl 내에 정의된 함수 SimpleFunc의 호출문장이다.
- 18행 : 이름공간 ProgComImpl 내에 정의된 함수 SimpleFunc의 호출문장이다.
출력 결과
BestCom이 정의한 함수
ProgCom이 정의한 함수
이름공간 기반의 함수 선언과 정의의 구분
NameSp2.cpp
#include <iostream>
using namespace std;
namespace BestComImpl {
void SimpleFunc(void);
}
namespace ProgComImpl {
void SimpleFunc(void);
}
int main(void) {
BestComImpl::SimpleFunc();
ProgComImpl::SimpleFunc();
return 0;
}
void BestComImpl::SimpleFunc(void) {
cout << "BestCom이 정의한 함수" << endl;
}
void ProgComImpl::SimpleFunc(void) {
cout << "ProgCom이 정의한 함수" << endl;
}
- 5~7행 : 이름공간 안에서 함수의 선언만 삽입되었다.
- 9~11행 : 마찬가지로 이름공간 안에서 함수의 선언만 삽입되었다.
- 20행 : 이름공간 BestComImpl에 선언된 함수 SimpleFunc의 정의부분이다.
이렇듯 ::연산자는 함수의 호출 이외에도 다양하게 사용된다. - 24행 : 마찬가지로 이름공간 ProgComImpl에 선언된 함수 SimpleFunc의 정의부분이다.
출력 결과
BestCom이 정의한 함수
ProgCom이 정의한 함수
NameSp3.cpp
#include <iostream>
using namespace std;
namespace BestComImpl {
void SimpleFunc(void);
}
namespace BestComImpl {
void PrettyFunc(void);
}
namespace ProgComImpl {
void SimpleFunc(void);
}
int main(void) {
BestComImpl::SimpleFunc();
return 0;
}
void BestComImpl::SimpleFunc(void) {
cout << "BestCom이 정의한 함수" << endl;
PrettyFunc(); // 동일 이름공간
ProgComImpl::SimpleFunc(); // 다른 이름공간
}
void BestComImpl::PrettyFunc(void) {
cout << "So Pretty!!" << endl;
}
void ProgComImpl::SimpleFunc(void) {
cout << "ProgCom이 정의한 함수" << endl;
}
- 5, 9행 : 이름공간은 둘 이상의 영역으로 나뉘어서 선언할 수도 있다.
물론 이 둘은 동일공간으로 간주된다. - 25행 : 23행에 정의된 함수와 동일한 이름공간에 정의된 함수이다.
따라서 이렇게 직접호출이 가능하다. - 26행 : 함수의 호출 위치가 어떻게 되건, 이름공간 ProgComImpl에 정의된 함수 SimpleFunc를 호출하는 방법에는 차이가 없다.
출력 결과
BestCom이 정의한 함수
So Pretty!!
ProgCom이 정의한 함수
using을 이용한 이름공간의 명시
UsingDcl1.cpp
#include <iostream>
using namespace std;
namespace Hybrid {
void HybFunc(void) {
cout << "So simple function!" << endl
<< "In namespace Hybrid!" << endl;
}
}
int main(void) {
using Hybrid::HybFunc;
HybFunc();
return 0;
}
- 13행 : 키워드 using을 이용해서 '이름공간 Hybrid에 정의된 HybFunc를 호출할 때에는, 이름공간을 지정하지 않고 호출하겠다!'는 것을 명시(선언)하고 있다.
- 14행 : 13행의 using 선언을 통해서 이름공간의 지정 없이 HybFunc 함수를 호출하고 있다.
출력 결과
So simple function!
In namespace Hybrid!
UsingDcl2.cpp
#include <iostream>
using std::cin;
using std::cout;
using std::endl;
int main(void) {
int num = 20;
cout << "Hello World!" << endl
<< "Hello " << "World!" << endl
<< num << ' ' << 'A'
<< ' ' << 3.14 << endl
return 0;
}
- 3~5행 : using 선언을 함수 밖에 전역의 형태로 삽입하였다.
따라서 이제부터는 cin, cout, endl의 사용에 있어서 이름공간의 지정이 불필요하다. - 9~12행 : using 선언을 통해서 코드의 구성이 한결 간단해졌음을 알 수 있다.
출력 결과
Hello World!
Hello World!
20 A 3.14
UsingDcl3.cpp
#include <iostream>
using namespace std;
int main(void) {
int num = 20;
cout << "Hello World!" << endl
<< "Hello " << "World!" << endl
<< num << ' ' << 'A'
<< ' ' << 3.14 << endl;
return 0;
}
출력 결과
Hello World!
Hello World!
20 A 3.14
이름공간의 별칭 지정
NameAlias.cpp
#include <iostream>
using namespace std;
namespace AAA {
namespace BBB {
namespace CCC {
int num1, num2;
}
}
}
int main(void) {
AAA::BBB::CCC::num1 = 20;
AAA::BBB::CCC::num2 = 30;
namespace ABC = AAA::BBB::CCC;
cout << ABC::num1 << endl
<< ABC::num2 << endl;
return 0;
}
- 14, 15행 : 별칭이 선언되기 이전의 변수 num1과 num2의 접근을 보이고 있다.
- 17행 : AAA::BBB::CCC에 ABC라는 별칭을 붙여주고 있다.
- 18, 19행 : 별칭의 선언 이후의 접근을 보이고 있다.
출력 결과
20
30
'Chlln's Code > C++' 카테고리의 다른 글
[C++] 01 - 6 : OOP 단계별 프로젝트 01단계 (2) | 2023.03.13 |
---|---|
[C++] 문제 01 - 4 [파일의 분할] (0) | 2023.03.13 |
[C++] 01 - 4 : 인라인(inline) 함수 (0) | 2023.03.13 |
[C++] 문제 01 - 3 [매개변수의 디폴트값] (2) | 2023.03.13 |
[C++] 01 - 3 : 매개변수의 디폴트값(Default Value) (0) | 2023.03.13 |