07
08

이름 충돌 문제를 C++에서는 네임스페이스(namespace)를 통해 내부 식별자 간에 충돌 가능성을 해결하고 있다.

 

C++에서 네임스페이스(namespace)란 내부 식별자에 사용될 수 있는 유효 범위를 제공하는 선언적 영역을 의미입니다.

 

예제 1)

#include <iostream>
using namespace std;

namespace BestComImpl
{
	void SimpleFunc(void)
	{
		cout << "BestCom이 정의한 함수" << endl;
	}
}

namespace ProgComImpl
{
	void SimpleFunc(void)
	{
		cout << "ProgCom이 정의한 함수" << endl;
	}
}

int main(void)
{
	BestComImpl::SimpleFunc();
	ProgComImpl::SimpleFunc();
}

해당 예제에 사용된 연산자 ::는 '범위지정 연산자'로 이름공간을 지정할 때 사용하는 연산자이다. 함수명이 같아도 다른 영역에 있다는 것을 명시하여 다른 함수를 호출하기 때문에 같은 함수 충돌을 방지할 수 있다.

 

예제 2)

#include <iostream>
using namespace std;

namespace BestComImpl
{
	void SimpleFunc(void);
}

namespace ProgComImpl
{
	void SimpleFunc(void);
}

int main(void)
{
	BestComImpl::SimpleFunc();
	ProgComImpl::SimpleFunc();
	return 0;
}

void BestComImpl::SimpleFunc(void)
{
	cout << "BestCom이 정의된 함수" << endl;
}

void ProgComImpl::SimpleFunc(void)
{
	cout << "ProgCom이 정의된 함수" << endl;
}

해당 예제는 이름공간 기반에서 함수의 선언과 정의를 구분하는 방법이다. 이름공간 안에서 함수를 선언하고 그 밑에 함수를 정의하는데, 여기서 함수를 정의할때 ::연산자를 사용한다.

 

예제 3)

#include <iostream>
using namespace std;

namespace BestComImpl
{
	void SimpleFunc(void);
}

namespace BestComImpl
{
	void PrettyFunc(void);
}

namespace ProgComImpl
{
	void SimpleFunc(void);
}

int main(void)
{
	BestComImpl::SimpleFunc();
	return 0;
}

void BestComImpl::SimpleFunc(void)
{
	cout << "BestCom이 정의된 함수" << endl;
	PrettyFunc();
	ProgComImpl::SimpleFunc();
}

void BestComImpl::PrettyFunc(void)
{
	cout << "So Pretty!!" << endl;
}

void ProgComImpl::SimpleFunc(void)
{
	cout << "ProgCom이 정의된 함수" << endl;
}

동일한 이름공간에 정의된 함수를 호출할 때에는 이름공간을 명시하지 않는 예제이다. PrettyFunc만 호출하여 결과값을 호출하는 것이 가능한 예제이다.

이름 공간의 중첩

 

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

namespace Parent
{
	int num=2;
    
    namespace SubOne
    {
    	int num=3;
    }
    
    namespace SubTwo
    {
    	int num=4;
    }
}

총 3개의 num이 존재하는데 각각 선언된 이름공간이 다르기 때문에 이름충돌 문제는 발생하지 않는다. 

코드를 실행하면 다음의 순서대로 실행이 된다.

cout << Parent::num << endl;
cout << Parent::SubOne::num << endl;
cout << Parent::SubTwo::num << endl;

 

문제)

#include <iostream>
using namespace std;

namespace BestComImpl
{
	void SimpleFunc(void);
}

namespace ProgComImpl
{
	void SimpleFunc(void);
}

int main(void)
{
	BestComImpl::SimpleFunc();
	ProgComImpl::SimpleFunc();
	return 0;
}

void BestComImpl::SimpleFunc(void)
{
	cout << "BestCom이 정의된 함수" << endl;
}

void ProgComImpl::SimpleFunc(void)
{
	cout << "ProgCom이 정의된 함수" << endl;
}

다음 코드를 헤더파일, 소스파일1, 소스파일2 총 3개의 파일로 분할해서 컴파일 해보자. 파일의 이름은 임의로 정해도 된다.

 

코드)

헤더.h

#include <iostream>
using namespace std;

namespace BestComImpl
{
	void SimpleFunc(void);
}

namespace ProgComImpl
{
	void SimpleFunc(void);
}

소스1.cpp

#include "헤더.h"

void BestComImpl::SimpleFunc(void)
{
	cout << "BestCom이 정의된 함수" << endl;
}

void ProgComImpl::SimpleFunc(void)
{
	cout << "ProgCom이 정의된 함수" << endl;
}

소스.cpp

#include "헤더.h"

int main(void)
{
	BestComImpl::SimpleFunc();
	ProgComImpl::SimpleFunc();
	return 0;
}

 

'코딩 > C++' 카테고리의 다른 글

06. 참조자_1  (1) 2022.07.14
05. 자료형 bool  (1) 2022.07.12
03. 인라인 함수  (2) 2022.06.30
02. 매개변수의 디폴트 값  (3) 2022.06.22
01. 함수 오버로딩  (0) 2022.06.15
COMMENT