C,C++/CONCEPT
C++ Chapter 01. C언어 기반의 C++ 1. 01-5 이름공간(namespace)에 대한 소개
너래쟁이
2018. 2. 28. 09:19
C++ Chapter 01. C언어 기반의 C++ 1.
01-5 이름공간(namespace)에 대한 소개
// 이름공간 = 이름을 붙여놓은 공간
* 이름공간의 등장배경
// 같이 프로젝트를 독립적으로 하고, 묶으려고하는데 함수의 이름이 같을때??
* 이름공간의 기본원리
// 연산자 '::'을 가리켜 '범위지정 연산자(Scope resolution operation)'라고 하며, 이름공간을 지정할 때 사용하는 연산자이다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | #include <iostream> namespace BestComImpl { void SimpleFunc(void) { std::cout<<"BestCom이 정의한 함수"<<std::endl; } } namespace ProgComImpl { void SimpleFunc(void) { std::cout<<"ProgCom이 정의한 함수"<<std::endl; } } int main(void) { BestComImpl::SimpleFunc(); // BestCom이 정의한 함수 ProgComImpl::SimpleFunc(); // ProgCom이 정의한 함수 return 0; } | cs |
* 이름공간 기반의 함수 선언과 정의의 구분
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | #include <iostream> namespace BestComImpl { void SimpleFunc(void); } namespace ProgComImpl { void SimpleFunc(void); } int main(void) { BestComImpl::SimpleFunc(); ProgComImpl::SimpleFunc(); return 0; } void BestComImpl::SimpleFunc(void) { std::cout<<"BestCom이 정의한 함수"<<std::endl; } void ProgComImpl::SimpleFunc(void) { std::cout<<"ProgCom이 정의한 함수"<<std::endl; } | cs |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | #include <iostream> 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) { std::cout<<"BestCom이 정의한 함수"<<std::endl; PrettyFunc(); // 동일 이름공간 (BestComImpl :: PrettyFunc()) ProgComImpl::SimpleFunc(); // 다른 이름공간 } void BestComImpl::PrettyFunc(void) { std::cout<<"So Pretty!!"<<std::endl; } void ProgComImpl::SimpleFunc(void) { std::cout<<"ProgCom이 정의한 함수"<<std::endl; } | cs |
* 이름공간의 중첩
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | namespace Parent { int num = 2; namespace SubOne { int num = 3; } namespace SubTwo { int num = 4; } } | cs |
1 2 3 | std::cout << Parent::num << std::endl; // 2 std::cout << Parent::SubOne::num << std::endl; // 3 std::cout << Parent::SubTwo::num << std::endl; // 4 | cs |
* std:cout, std::cin, std::endl
std:cout // 이름공간 std에 선언된 cout
std::cin // 이름공간 std에 선언된 cin
std::endl // 이름공간 std에 선언된 endl
* using을 이용한 이름공간의 명시1 (지역변수의 선언와 마찬가지)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | #include <iostream> namespace Hybrid { void HybFunc(void) { std::cout<<"So simple function!"<<std::endl; std::cout<<"In namespace Hybrid!"<<std::endl; } } int main(void) { using Hybrid::HybFunc; // 키워드 using을 이용해서 이름 공간을 지정하지 않고 호출하겠다! HybFunc(); return 0; } | cs |
* using을 이용한 이름공간의 명시2 (전역변수의 선언와 마찬가지)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | #include <iostream> using std::cin; using std::cout; using std::endl; int main(void) { int num=20; cout<<"Hello World!"<<endl; cout<<"Hello "<<"World!"<<endl; cout<<num<<' '<<'A'; cout<<' '<<3.14<<endl; return 0; } | cs |
1 2 3 4 5 6 7 8 9 10 11 12 | #include <iostream> using namespace std; // 이름공간 std에 선언된 모든 것에 대해 이름공간 지정의 생략 int main(void) { int num=20; cout<<"Hello World!"<<endl; cout<<"Hello "<<"World!"<<endl; cout<<num<<' '<<'A'; cout<<' '<<3.14<<endl; return 0; } | cs |
* 이름공간의 별칭 지정
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | #include <iostream> using namespace std; namespace AAA { namespace BBB { namespace CCC { int num1; int num2; } } } int main(void) { AAA::BBB::CCC::num1=20; AAA::BBB::CCC::num2=30; namespace ABC=AAA::BBB::CCC; // ABC라는 별칭을 주기 위한 문장구성 cout<<ABC::num1<<endl; // 20 cout<<ABC::num2<<endl; // 30 return 0; } | cs |
* 범위지정 연산자(Scope Resolution Operator)의 또 다른 기능
1 2 3 4 5 6 7 8 | int val = 100; // 전역변수 int SimpleFunc(void) { int val = 20; // 지역변수 var += 3; // 지역변수 val의 값 3 증가 :: val += 7; // 전역변수 val의 값 7 증가 } | cs |