namespace는 말 그대로 특정 영역
에 이름
을 붙여주어 사용하는 것 입니다.
namespace는 프로그램이 대형화 되어가면서 이름의 충돌이 일어나는 문제가 등장하면서 이 문제를 해결하기위해 나왔습니다.
예를들어 회사 A, B, C가 있는데 이 회사가 프로젝트를 각각 나눠서 구현한 후 마지막에 하나의 프로젝트로 만들기로 했을 때 서로 변수 및 함수의 이름이 충돌이 일어날 가능성이 많습니다. 이럴 때 서로 모든 변수와 함수를 정해놓기도 힘들고 나중에 중복되는 부분을 변경하기도 힘듭니다.
이럴 때 namespace를 사용한다면 간단하게 해결할 수 있습니다.
namespace의 사용법은 다음과 같이 선언 및 정의하여 사용할 수 있습니다.
namespace A
{
void printHi();
}
namespace B
{
void printHi();
}
void A::printHi()
{
std::cout << "Hi A!" << std::endl;
}
void B::printHi()
{
std::cout << "Hi B!" << std::endl;
}
int main(void)
{
A::printHi();
B::printHi();
return (0);
}
출력은 이렇게 나옵니다.
Hi A!
Hi B!
이렇게 사용한다면 각 변수 및 함수 이름의 충돌은 일어나지 않습니다.
여기에서 나오는 ::
은 범위지정 연산자
라고 합니다.
using
을 이용한다면 범위지정연산자를 굳이 이용하지 않아도 됩니다.
int main(void)
{
using A::printHi;
printHi();
return (0);
}
이렇게 using을 사용하면 선언한 함수
내에서 사용이 가능합니다.
모든 곳에서 효력을 갖고싶게 한다면 전역변수
로 선언하면 됩니다.
만약 namespace내의 모든 변수 및 함수를 사용하고 싶다면
using namespace A
처럼 선언하면 됩니다.
namespace는 중복선언이 가능하고 중복된 선언이 길어진다면 별칭
을 만들수도 있습니다.
namespace A
{
int num = 0;
namespace B
{
int num = 1;
namespace C
{
int num = 2;
}
}
}
int main(void)
{
std::cout << A::num << A::B::num << A::B::C::num << std::endl;
// 별칭
namespace ABC = A::B::C;
std::cout << ABC::num << std::endl;
return (0);
}
출력은 다음과 같습니다.
012
2
[ c++ ] namespace
[ c++ ] 클래스, 생성자, 소멸자, 이니셜라이저, this포인터
[ c++ ] c++에서의 const와 static
[ c++ ] 참조자(reference)
[ c++ ] new와 delete
[ c++ ] 함수 오버로딩
[ c++ ] 파일 입출력 (ifstream, ofstream)
[ c++ ] 함수포인터, 멤버 함수포인터
[ c++ ]연산자 오버로딩
[ c++ ] 캡슐화란?
[ c++ ] 상속과 다형성에 대해 알아보자