본문 바로가기
Develop/C++

[C ++] Namespace 와 using

by J-rain 2023. 2. 2.

namespace

네임스페이스는 C++가 지원하는 각종 요소들(변수, 함수, 클래스 등)을 한 범주로 묶어주기 위한 문법이다.

 

namespace 이름
{
  // 네임스페이스의 시작

.......

  // 네임스페이스의 끝
}

 

#include <iostream>

namespace Test
{
  int data = 100;
  
  void TestFunc(void)
  {
  std::cout << "Test::TestFunc()" << std::endl;
  }
}

int main(void)
{  
  Test::TestFunc();
  std::cout << Test::data << std::endl;
  
  return 0;
}

실행결과

  • 네임스페이스가 존재할 경우 식별자 앞에 범위 지정 연산자(::)를 이용해 네임스페이스를 기술할 수 있다.
  • TestFunc() 함수가 Test 네임스페이스 소속이듯 cout은 std라는 네임스페이스 소속이다. 참고로 main()함수는 '전역 네임스페이스(Global namespace)'에 속한다.

이렇듯 TestFunc(), cout, main() 등은 각자 속한 네임스페이스가 모두 다르다.

 

using

네임스페이스를 문법에 따라 생략해야 하는데, 이 때 사용하는 예약어가 using이다.

using namespace 네임스페이스이름; 
#include <iostream>

 // std 네임스페이스를 using 예약어로 선언
 using namespace std;
 
 namespace Test
 {
  int Data = 100;
  
  void TestFunc(void)
  {
    // cout에 대해서 범위를 지정하지 않아도 상관없다.
    cout << "Test::TestFunc()" << endl;
  }
}

 // Test 네임스페이스에 using 선언을 한다.
 using namespace Test;
 
 int main(void)
 {
   // TestFunc()나 data 에도 범위 지정을 할 필요가 없다.
   TestFunc();
   cout << Data << endl;
   
 return 0;
 }

실행결과

네임스페이스를 명시하지 않았지만 컴파일 오류 없이 실행이 잘된다.

 

네임스페이스의 중첩

서울시 강남구 대치동 XXX로 XX길

이와 같은 주소를 네임스페이스로 표현하자면 다음과 같다.

서울시::강남구::대치동::XXX로::XX길

작은 규모의 범위가 속할 수도 있고, 범위가 여러 개 존재할 수도 있다.

네임스페이스도 이렇다. 네임스페이스 안에 또 다른 네임스페이스가 속할 수 있다.

#include<iostream>
using namespace std;

namespace Test1
{
  int Data = 100;
  namespace Test2
  {
   int Data = 200;
   namespace Test3
   {
    int Data = 300;
   }
  }
}

int main(void)
{
 cout << Test1::Data << endl;
 cout << Test1::Test2::Data << endl;
 cout << Test1::Test2::Test3::Data << endl;
 
 return 0;
 
 }

실행결과

  • 6,9,12번 행에 선언된 int Data 변수는 이름은 같아도 전혀 다른 세 개의 전역 변수이다.
  • 따라서 접근할 때는 19~21번 행처럼 정확히 네임스페이스를 명시해야 한다.

 

ps. 식별자 앞에 별도로 범위 지정 연산자를 붙이지 않는다면 정해진 순서에 따라 다양한 범위를 대상으로 식별자 선언을 검색한다. 자세한내용 => https://j-ra1n.tistory.com/entry/%EC%8B%9D%EB%B3%84%EC%9E%90-%EA%B2%80%EC%83%89-%EC%88%9C%EC%84%9C

'Develop > C++' 카테고리의 다른 글

[C ++] 접근 제어 지시자  (0) 2023.02.03
[C ++] 클래스 기본 문법  (0) 2023.02.03
[C ++] 식별자 검색 순서  (0) 2023.02.02
[C ++] 템플릿(Template)  (1) 2023.02.02
[C ++] 다중 정의 (Overloading)  (0) 2023.02.02

댓글