c++

이름 공간 - namespace

연결리스트 2020. 8. 15. 19:31

이름공간이란 어떤 정의된 객체에 대해 어디 소속인지 지정해주는 것이다

같은 이름이라도 소속된 이름공간이 다르면 다른것으로 취급한다 

 

std::cout 

 - std라는 이름 공간에 정의되어 있는 cout을 의미한다 

 - std라는 이름공간 없이 cout만을 사용하면 컴파일러는 cout을 찾지 못한다 

 

이름공간 정의 방법

ex)

namespace header1 {

      int foo();

      void bar();

}

 

namespace header2 {

      int foo();

      void bar();

}

 - 두 헤더파일 header1.h와 header2.h가 존재하는 경우 header1에 있는 foo()는 header1의 이름공간에

   존재하는 것이고 header2에 있는 foo()는 header2의 이름공간에 존재한다 

 

 - 자기자신이 포함되어 있는 이름공간 안에서는 앞에 이름공간을 명시하지 않고 자유롭게 부를 수 있다

 

 - header1의 이름공간 안에서 foo()를 호출하면 알아서 header1::foo()가 호출된다 

 

 - header2::foo(); 라고 이름공간을 정확히 명시해주면 header1의 이름공간 안에서 header2의 foo() 또한 호출 가능하다

 

 - 아무 이름공간에도 소속되지 않는 경우라면 명시적으로 이름공간을 지정해 주어야 한다.

 

 - using header1::foo; 를 통해 header1 이름공간에 있는 foo()만 사용할 것이다라고 선언할 수 있다

 

 - header1 이름 공간안에 정의된 모든 것들을 header1:: 없이 사용하고자 한다면 using namespace header1;을

   명시해주면 된다

 

using namespace std; 같은 이름공간을 사용하겠다라고 선언하는 것은 권장하지 않는 방법이었다...

std::cout 같이 std '이름공간의 함수이다'라고 명시해주는 것이 좋다

 

namespace {

      int OnlyInThisFile() {}

      int Only_in_this_file = 0;

}

위의 방법을 통해 이름을 설정하지 않고 사용할 수도 있다. 하지만 위와 같은 경우 해당 이름 공간에 정의된 것들은 해당 파일 안에서만 접근이 가능하다. OnlyInThisFile() 와 Only_in_this_file은 해당 파일 안에서만 접근할 수 있는 것이다.

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

헤더파일을 통해 파일을 받았다 하더라도 해당 이름공간 안에 정의된 모든 것들은 사용할 수 없다.

(main 함수 부분 제외)