컴퓨터 공학 일지/C++
C++ 이름공간(네임스페이스{namespace})
Basasakk
2019. 12. 16. 17:20
네임 스페이스의 사용 이유
- 다수의 집단이 한가지의 프로젝트를 진행할 경우 중복되는 함수,변수들이 발생할 수 있기 때문에 이를 피하기 위하여 고안된 방법
네임 스페이스의 기본 이해
다수의 집단이 프로젝트에 참여하고 있다는 가정하에 예제를 들어 이해해봅시다.
#include <iostream>
using namespace std;
void Function(void)
{
cout << "A집단의 함수" << endl;
}
void Function(void)
{
cout << "B집단의 함수" << endl;
}
int main(void) {
Function();
return 0;
}
A집단과 B집단이 서로 각기 다른 기능의 함수를 구현하였으나 함수의 이름이 같기 때문에 충분히 오류를 발생시킬 수 있는 상황입니다.
이 경우에 네임 스페이스를 활용합니다.
#include <iostream>
using namespace std;
namespace TeamA {
void Function(void)
{
cout << "A집단의 함수" << endl;
}
}
namespace TeamB {
void Function(void)
{
cout << "B집단의 함수" << endl;
}
}
int main(void) {
TeamA::Function();
TeamB::Function();
return 0;
}
위처럼 네임스페이스로 함수를 한번 감싼후 네임스페이스::함수() 로 호출을 하게되면 함수의 이름이 같다 하더라도 각 함수가 저장된 영역이 다르기 때문에 문제없이 실행이 가능합니다.
네임스페이스 기반의 함수 선언과 정의
#include <iostream>
namespace TeamA {
void Function(void);
}
namespace TeamB {
void Function(void);
}
int main(void) {
TeamA::Function();
TeamB::Function();
return 0;
}
void TeamA::Function(void)
{
std::cout << "TeamA의 함수" << std::endl;
}
void TeamB::Function(void)
{
std::cout << "TeamB의 함수" << std::endl;
}
이처럼 함수 정의부를 네임스페이스로 분류할 수 도 있다.
네임스페이스 기반의 함수 선언과 정의 이해의 확장
#include <iostream>
namespace TeamA {
void Function(void);
}
namespace TeamA {
void SecondFunction(void);
}
namespace TeamB {
void Function(void);
}
int main(void) {
TeamA::Function();
return 0;
}
void TeamA::Function(void)
{
std::cout << "TeamA의 함수" << std::endl;
SecondFunction();
TeamB::Function();
}
void TeamA::SecondFunction(void)
{
std::cout << "TeamA의 두번째 함수" << std::endl;
}
void TeamB::Function(void)
{
std::cout << "TeamB의 함수" << std::endl;
}
위 예제에서처럼 동일한 네임스페이스를 참조하고 있을때는 네임스페이스의 정의없이 함수를 호출할 수 있고 함수의 호출위치는 어느 네임스페이스의 함수를 호출하던 상관이 없다.
또한 네임스페이스는 중첩이 가능하다.
namespace A{
int num=2;
namespace B{
int num=3;
namespace C{
int num=4;
}
}
}
모든 num을 가져오려면 다음과 같이하면된다.
또한 변수의 이름은 같더라도 다른 네임스페이스의 영역에 존재하기에 오류가 발생하지않는다.
std::cout << A::num << std::endl;
std::cout << A::B::num << std::endl;
std::cout << A::B::C::num << std::endl;