[C++] namespace와 using 사용법


Study/C , C++ , MFC  2020. 3. 20. 23:30

안녕하세요. 명월입니다.


이 글은 C++에서 사용되는 namespace와 using 사용법에 대한 글입니다.


이전에 제가 C++에서 함수 사용법과 클래스에 대해서 설명했습니다.

링크 - [C++] 함수 사용법(가변 파라미터 stdarg.h, 함수 포인터 그리고 범용 포인터 void*)

링크 - [C++] 클리스 선언과 사용법


C++에서는 Java와 C#과 다르게 가장 최소 단위가 함수 단위입니다. 그 뜻은 class가 없어도 main 함수만 있어도 실행이 됩니다.

거기에서 클래스를 확장하고.. 더욱 큰 함수면 라이브러리나 프로젝트를 달리해서 참조 형식으로 사용할 수 있습니다.


그러나 이 함수나 클래스만으로도 유니크 명명이 한계가 있습니다.

예를 들면, 한개의 프로젝트에 두개의 데이터 베이스를 접속한다고 할 떄, oracle과 mssql를 접속하는 라이브러리를 사용한다고 하면 아마 한두개 정도는 class명이 겹치는 경우가 발생할 것입니다.

그래서 이런 것을 해결하기 위해서는 namespace가 있습니다. 이 namespace는 Java의 package와 C#의 namespace와 같은 개념입니다.

#include <stdio.h>
#include <iostream>
using namespace std;
// namespace A 구역을 선언
namespace A
{
  // Test 클래스 선언
  class Test
  {
  // 접근 제한자 설정
  public:
    // 함수 설정
    void print()
    {
      // 콘솔 출력
      cout << " namespace - A : " << " Test::print() " << endl;
    }
  };
}
// namespace B 구역을 선언
namespace B
{
  // Test 클래스 선언
  class Test
  {
  // 접근 제한자 설정
  public:
    // 함수 설정
    void print()
    {
      // 콘솔 출력
      cout << " namespace - B : " << " Test::print() " << endl;
    }
  };
}
// 실행 함수
int main()
{
  // A namespace의 Test 클래스를 할당.
  A::Test test1;
  // A namespace의 Test클래스의 print() 함수를 호출
  test1.print();

  // B namespace의 Test 클래스를 할당.
  B::Test test2;
  // B namespace의 Test클래스의 print() 함수를 호출
  test2.print();

  return 0;
}

Test 이름의 클래스가 두개 작성이 가능합니다. 차이는 namespace로 구분이 다릅니다.

사용할 떄는 클래스 앞에 namespace명으로 구분해서 Test 클래스를 구분합니다.


using은 namespace를 전역으로 선언이 가능합니다.

Java에서 import와 C#의 using과 같습니다. 차이는 C++에는 include가 존재합니다.

include는 파일을 포함시키는 전처리문이고 using은 namespace의 영역의 객체를 명시하지 않아도 사용할 수 있게 하는 키워드입니다.

#include <stdio.h>
#include <iostream>
using namespace std;
// namespace A 구역을 선언
namespace A
{
  // Test 클래스 선언
  class Test
  {
  // 접근 제한자 설정
  public:
    // 함수 설정
    void print()
    {
      // 콘솔 출력
      cout << " namespace - A : " << " Test::print() " << endl;
    }
  };
}
// namespace B 구역을 선언
namespace B
{
  // Test 클래스 선언
  class Test
  {
  // 접근 제한자 설정
  public:
    // 함수 설정
    void print()
    {
      // 콘솔 출력
      cout << " namespace - B : " << " Test::print() " << endl;
    }
  };
}
// B namespace의 객체는 따로 명시하지 않아도 사용 가능하다.
using namespace B;
// 실행 함수
int main()
{
  // Test 클래스는 A namespace와 B namespace가 있습니다.
  // using으로 B namespace를 선언했기 때문에 클래스는 B namespace를 가르킵니다.
  Test test;
  // B namespace의 Test클래스의 print() 함수를 호출
  test.print();

  return 0;
}

Test클래스를 할당할 때 따로 namespace를 선언하지 않아도 namespace B의 Test클래스가 선언되었습니다.

그건 using으로 namespace를 객체 명시를 하지 않아도 사용할 수 있게 설정했기 때문입니다. 여기서 namespace A의 Test를 사용하려면 A::Test이렇게 명시하면 됩니다.

참고로 여기서 using namespace A로 추가를 하게 되면 Test 클래스가 모호해지기 떄문에 에러가 발생합니다.

C++에는 다른 언어에는 없는 예약어 키워드를 만들 수 있는 typedef 키워드가 있습니다. typedef에 대해서는 operator와 같이 설명하겠습니다.

즉, using namespace를 사용하지 않고 typedef로도 namespace를 설정할 수 있습니다.

#include <stdio.h>
#include <iostream>
using namespace std;
// namespace A 구역을 선언
namespace A
{
  // Test 클래스 선언
  class Test
  {
  // 접근 제한자 설정
  public:
    // 함수 설정
    void print()
    {
      // 콘솔 출력
      cout << " namespace - A : " << " Test::print() " << endl;
    }
  };
}
// namespace B 구역을 선언
namespace B
{
  // Test 클래스 선언
  class Test
  {
  // 접근 제한자 설정
  public:
    // 함수 설정
    void print()
    {
      // 콘솔 출력
      cout << " namespace - B : " << " Test::print() " << endl;
    }
  };
}
// A::Test를 Test로 예약어를 바꾼다.
typedef A::Test Test;
// 실행 함수
int main()
{
  // 이건 예약어를 설정했기 때문에 Test = A::Test이다.
  Test test;
  // A namespace의 Test클래스의 print() 함수를 호출
  test.print();

  return 0;
}

참고로 typedef로도 namespace를 사용할 수 있다는 것을 설명했습니다.


여기까지 C++에서 사용되는 namespace와 using 사용법에 대한 글이었습니다.


궁금한 점이나 잘못된 점이 있으면 댓글 부탁드립니다.