Project Hub

1. namespace 본문

C++/c++ basic

1. namespace

safy 2022. 12. 21. 11:02
728x90
반응형

namespace(이름공간)

개체를 구분할 수 있는 범위를 나타내는 말
함수나 구조체 혹은 변수 이름 등의 소속을 정해주는 것

아래는 namespace 사용 예시 중 하나다.

 

각각의 header1, header2 라는 namespcae 가 있고, 그 안에 foo, bar 라는 이름의 함수가 정의되어 있다. 


header1.h 혹은 header2.h 가 선언된 공간에서는 굳이 앞에 namespace 를 명시하지 않고 자유롭게 사용 가능하다.

// header1.h 의 내용
namespace header1
{
    int foo();
    void bar();
}

// header2.h 의 내용
namespace header2
{
    int foo();
    void bar();
}

반면에 어떠한 namespace 에도 소속되지 않는 경우라면 아래와 같이 명시적으로 namespace를 지정해야 한다.

#include "header1.h"
 
namespace header1
{
    int func()
    {
        foo();  // header1::foo() 가 실행된다.
    }
}

header1과 header2의 함수들을 적절히 사용하길 원한다면 아래와 같이 명시적으로 namespace를 지정해주면 된다.

#include "header1.h"
 
int func()
{
    header1::foo(); // header1::foo() 가 실행된다.
}

위 내용을 정리하면, 아래와 같이 두 가지의 방법이 존재하고, 

 

더 권장되는 방식은 using namespace std; 와 같이 사용하는 것 보다는

 

std:: 와 같이 직접 사용 할 함수 앞에 붙여 std의 namepsace 함수라는 것을 명시하는 것이 권장된다.

 

#include "header1.h"
#include "header2.h"
 
 // 더 권장하는 방식
int func()
{
    header1::foo(); // header1::foo() 가 실행된다.
    header2::bar(); // header2::bar() 가 실행된다.
}


////////////////////////////////////////////////////

#include "header1.h"
 
using namespace header1;
 
int func()
{
    foo(); // header1::foo() 가 실행된다.
}

추가적으로 이름이 없는 namespace도 있다.

이 경우는 해당 namespace에 정의된 것들은 해당 파일 안에서만 접근할 수 있게 된다.

마치 static 키워드를 사용한 것과 같은 효과를 낸다.

#include <iostream>
 
namespace
{
    // 이 함수는 이 파일 안에서만 사용할 수 있다.
    // static int OnlyInThisFile() 과 동일하다.
    int OnlyInThisFile() {}
     
    //이 변수 역시 static int  only_in_this_file 와 동일하다.
    int only_in_this_file = 0;
} // namespace
 
int main()
{
    OnlyInThisFile();
    only_in_this_file = 3;
}

 

728x90
반응형

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

6. Wrapper 클래스 - 타입변환 연산자  (3) 2022.12.21
5. 연산자 오버로딩, friend 키워드  (3) 2022.12.21
4. implicit, explicit, mutable 키워드  (2) 2022.12.21
3. copy consturctor  (2) 2022.12.21
2. reference  (1) 2022.12.21
Comments