namespace는 클래스의 느낌이랑 비슷한 것 같다. 다만 오버라이딩 오버로딩 안되고 접근자 설정 못 해주고 뭐.. 그런 거? 그냥 딱 소속만 정해준다.

기본적으로 namespace는 외부를 끌어다 쓰거나 내부에서 새로 만들어서 쓴다.

using namespace std;
using namespace blahblah;

위와 같은 형식처럼 namespace를 사용할 수 있다 (충돌 위험으로 권하지는 않음).

소속을 지정해주지 않으면 대충 std랑 blahblah로 간주하겠다는 의민데, std::func1(), blahblah::func1()같이 이름이 같은 함수가 있다면 충돌 위험이 있다.

그리고 개발자가 스스로 namespace를 따로 만들어 줄 수 있다.

namespace asdf {
    int a = 0xdeadbeef;
    int b = 0x313370;
    namespace qwer {
        int a = 0x1234;
        int b = 0x5678
    };
    void func() {
        std::cout << "what?" << std::endl;
    };
}

이렇게 namespace를 만들어줄 수 있는데, 보는 그대로 namespace안에다가 namespace를 만들어 줄 수 있고, namespace안에 함수도 만들어줄 수 있다.

이제 여기서 조금 재밌는 점이 한 가지 있는데, 저렇게 namespace안에 만들어 준 변수는 bss영역에 값이 초기화 된 채로 연속 된 주소를 갖는다.

그런데, namespace안에서 만들어 준 namespace나 함수는 독자적인 주소를 갖는다.

즉 구조체나, 객체에 접근할 때 처럼 접근하는 건 아니다.

변수 제외 그냥 코드 상에서만 소속을 정해주는 것이다.

namespace a {
    int a = 1;
    int b = 2;
    namespace n {
        int a = 1;
        int b = 2;
        int c = 3;
    }
    int c = 3;
}

위 코드를 작성했다고 치고 메모리를 보게 되면

a::a
a::b
a::c

위 세 변수는 연속된 주소를 갖는다.

그리고

a::n::a
a::n::b
a::n::c

위 세 변수도 연속된 주소를 갖는데 아까 위에서 선언한 변수들과는 독자적으로 연속된 주소를 갖는다.