‘이름을 붙여놓은 공간’
특정 영역에 이름을 붙여주기 위한 문법적 요소이다.
한집에 철수라는 사람이 두명이 산다면 문제가 될 수 있다. 그러나 서로 다른집에 살고 있다면 문제가 될게 없다. 201호 철수와 202호 철수로 부르면 되기 떄문이다.
#include <iostream>
void SimpleFunc(void)
{
std::cout<<"BestCom이 정의한 함수"<<std::endl;
}
void SimpleFunc(void)
{
std::cout << "ProgCom이 정의한 함수" << std::endl;
}
int main(void)
{
SimpleFunc();
return 0;
}
문제 발생.
namespace BestComImpl
{
//이름공간 내부
}
namespace ProgComImpl
{
//이름공간 내부
}
요렇게 namespace 를 사용하면 충돌이 일어나지 않는다.
#include <iostream>
namespace BestComImpl
{
void SimpleFunc(void)
{
std::cout<<"BestCom이 정의한 함수"<<std::endl;
}
}
namespace ProgComImpl
{
void SimpleFunc(void)
{
std::cout << "ProgCom이 정의한 함수" << std::endl;
}
}
int main(void)
{
BestComImpl::SimpleFunc();
ProgComImpl::SimpleFunc();
return 0;
}
위 예제에서 사용된 연산자 ::을 가리켜 ‘범위지정 연산자(scope resolution operator)’라 하며, 그 이름이 의미하듯이 이름공간을 지정할 때 사용하는 연산자이다.
함수는 선언과 정의를 분리하는 것이 일반적이다. ‘함수의 선언’은 헤더파일에 저장하고, ‘함수의 정의’는 소스파일에 저장하는 것이 보통이다.
#include <iostream>
namespace BestComImpl
{
void SimpleFunc(void);
}
namespace ProgComImpl
{
void SimpleFunc(void);
}
int main(void)
{
BestComImpl::SimpleFunc();
ProgComImpl::SimpleFunc();
return 0;
}
void BestComImpl::SimpleFunc(void)
{
std::cout<<"BestCom이 정의한 함수"<<std::endl;
}
void ProgComImpl::SimpleFunc(void)
{
std::cout<<"ProgCom이 정의한 함수"<<std::endl;
}
동일한 이름공간에 정의된 함수를 호출할 때에는 이름공간을 명시할 필요가 없다.
void BestComImpl::SimpleFunc(void)
{
std::cout<<"BestCom이 정의한 함수"<<std::endl;
prettyFunc();
ProgComImpl::SimpleFunc();
}
이름공간은 다른 이름공간에 삽입될 수 있다.