본문 바로가기
C++

[C++] 이름공간(네임스페이스)

by 프링글's 2022. 9. 25.

말그대로 이름을 붙여놓은 공간

 

두개의 함수를 서로 구분할 수 없는 경우, 즉 오버로딩이 불가능한 경우에 이름공간을 만들어 서로 다른 이름공간에 함수를 정의하면 두 함수를 구분할 수 있게된다.

namespace NSone{
    void func();
}

namespace NStwo{
    void func();
}

 

 

이처럼 이름공간으로 구분된 함수를 사용하기 위해 '범위지정 연산자' ::을 사용한다.

#include <iostream>
namespace NSone{
    void func(){...}
}

namespace NStwo{
    void func(){...}
}

int main(){
    NSone::func();
    NStwo::func();
}

 

 

선언만 이름공간에서 하고 정의를 따로하는 것도 가능하다.

namespace NSone{
    void func();
}

namespace NStwo{
    void func();
}

void NSone::func(){...}
void NStwo::func(){...}

 

 

같은 이름공간에 있는 함수를 호출할 때는 이름공간을 명시하지 않아도 된다.

namespace NSone{
    void func();
    void hello();
}

void NSone::func(){
    hello();		//NSone::hello()라고 할 필요 없음
}

 

 

여러가지 이름공간을 중첩해서 사용할 수 있다. 즉, 이름공간 안에 이름공간을 더 삽입할 수 있다.

#include <iostream>

namespace parent{
    namespace son{
    	int num;
    }
}

int main(){
    std::cout << parent::son::num;
}

 

 

std또한 iostream이라는 헤더파일에 있는 이름공간이며, cout, cin, endl은 std라는 이름공간 안에 선언되어 있다.

 

 

 

using을 이용하면 범위지정 없이도 이름공간 안에 선언된 내용들을 호출할 수 있다.

#include <iostream>

namespace NSone{
    void func(){...}
}

int main(){
    using NSone::func;	//func함수를 이름공간 NSone에서 찾아 호출해라
    func();
    return 0;
}

std::cout, cin, endl의 이름공간인 std::를 생략하고 싶다면 다음과 같이 using namespace std를 사용하면 된다.

#include <iostream>
using namespace std;

int main(){
    cout << "Hello, World!" << endl;
    return 0;
}

 

복잡하게 중첩된 이름공간을 묶어서 별칭을 주는 것도 가능하다.

namespace A{
    namespace B{
        namespace C{
            int num;
        }
    }
}

namspace ABC = A::B::C;     //A::B::C라는 공간을 묶어서 ABC라고 하겠다는 의미

int main(){
    ABC::num = 10;
}

 

댓글