이름 충돌 문제를 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 |