말그대로 이름을 붙여놓은 공간
두개의 함수를 서로 구분할 수 없는 경우, 즉 오버로딩이 불가능한 경우에 이름공간을 만들어 서로 다른 이름공간에 함수를 정의하면 두 함수를 구분할 수 있게된다.
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;
}
'C++' 카테고리의 다른 글
[C++] 함수 오버로딩과 매개변수의 디폴트 값 (0) | 2022.07.13 |
---|---|
[C++] C++의 입출력 방식 std::cout, std::cin (0) | 2022.07.13 |
댓글