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