Software Development/C, C++

[C++] namespace & using

huiyu 2018. 12. 2. 17:23

namespace : 말 그대로 특정 영역에 이름을 붙여주기 위한 문법적인 요소,
함수의 소속을 구분해주는 역할을 한다.

같은 이름을 가진 함수나 변수더라도 소속, namespace에 따라 구분이 될 수 있다.

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();
}
 
void BestComImpl::SimpleFunc(void)
{
  std::cout<<"BestCom이 정의한 함수"<std::endl;
}
 
 
void ProgComImpl::SimpleFunc(void)
{
  std::cout<<"ProgCom이 정의한 함수"<std::endl;
}
 
cs

위 예제에서 사용된 연산자 ::을 가리켜 '범위지정 연산자(scope resolution operator)'라 한다.
namespace를 지정할때 사용하는 연산자이다.

[namespace] :: [함수]


* namespace는 중첩으로 사용가능하다.

1
2
3
4
5
6
7
8
9
10
11
12
13
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;
std::cout<< Parent::SubOne::num << std::endl;
std::cout<< Parent::SubTwo::num << std::endl;
cs


* std::cout, std::cin, std::endl

 - std::cout, 이름공간 std에 선언된 cout함수
 - std::cin, 이름공간 std에 선언된 cin 함수
 - std::endl, 이름공간 std에 선언된 endl함수

-> 헤더파일 <iostream>에 선언된 namespace std안에 선언된 함수들이란 것을 알 수 있다.
 그 외 C++표준에서 제공하는 다양한 요소들은 std안에 선언되어 있다.


* using

 -> std::와 같이 ::(범위지정 연산자)를 귀찮게 안붙이기 하는 방법

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;
  HybFunc();
  return 0;
}
cs

 using Hybrid::HybFunc 
 -> HybFunc를 namespace Hybrid에서 찾으라는 선언,

* 위 예제에서 using문은 main함수 내에서 존재하게 되는데 이는 지역변수 선언과 같이,
 선언된 이후부터 효력을 발휘하며, 선언된 지역을 벗어나면 선언의 효력을 잃게 된다.
 프로그램 전체영역에 효력을 미치게 하려면 전역변수와 마찬가지로 함수 밖에 선언을 해야한다. 

아래 샘플과 같이,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#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

위와같이 일일히 함수를 using으로 선언하기 귀찮다면 아래같이 사용하여도 된다.
 -> using namespace std;


* namespace의 별칭 지정

 namespace ABC=AAA::BBB::CCC;

  ABC::num1=10;
  ABC::num2=20;


* 범위 지정 연산자(::)의 또다른 기능

1
2
3
4
5
6
7
8
9
10
#include <iostream>
 
int val=100;
 
int SimpleFunc(void)
{
  int val=20;  //지역변수 선언
  val+=3;      //지역변수 val의 값 3 증가
  ::val+=7;    //전역변수 val의 값 7증가
}
cs

 -> 전역변수와 지역변수 val이 동일하게 선언되었을때 ::를 사용하여 전역변수에 접근 가능하다.


[출처]
 윤성우의 열혈 C++ 프로그래밍 01-5 이름공간(namespace)에 대한 소개
 http://thinkpro.tistory.com/22

728x90