‘이름을 붙여놓은 공간’

특정 영역에 이름을 붙여주기 위한 문법적 요소이다.

한집에 철수라는 사람이 두명이 산다면 문제가 될 수 있다. 그러나 서로 다른집에 살고 있다면 문제가 될게 없다. 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;
}

Untitled

문제 발생.

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;
}

Untitled

위 예제에서 사용된 연산자 ::을 가리켜 ‘범위지정 연산자(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();
}

이름공간의 중첩

이름공간은 다른 이름공간에 삽입될 수 있다.