이름 공간 - namespace
이름공간이란 어떤 정의된 객체에 대해 어디 소속인지 지정해주는 것이다
같은 이름이라도 소속된 이름공간이 다르면 다른것으로 취급한다
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 함수 부분 제외)