2020. 11. 7. 20:54ㆍc++
[C++] 이름 공간
이름 공간이란 다소 생소하겠지만 그렇다고 어려운 것은 아니다. 이름 공간을 풀어서 이야기하자면 공간에 이름을 붙여놓은 것이다. 말 그대로 특정 영역에 이름을 붙인 것이다.
등장 배경/필요 이유
프로그램이 대형화되면서 이름의 충돌 문제가 생기기 시작했습니다. 예로 한 시스템을 만들 때 여러 업체가 참여해서 서로 일을 구분해서 독립적으로 만들어오자!라고 정한 뒤 서로 시스템을 구현해서 들고 왔는데 합치려고 하니 변수명이 같아서 한 업체에서 만들어온 시스템의 변수를 바꿔야 하는 상황이 생긴 것이다! 이런 문제를 해결하기 위해서는 미리 변수명을 정해놓으면 좋지만 그건 근본적인 해결책이 아니다 그렇기 때문에 C++에서는 이름 공간이라는 문법으로 이 문제를 해결했다.
이제 이름 공간의 사용법에 대해 알아보자
namespace 이름공간이름
{
이름공간 내용
}
이름 공간은 위와 같이 정의해서 사용할 수 있다. 예제를 보자
#include<iostream>
namespace Test
{
void TestFunc(void)
{
std::cout<<"Test가 정의한 함수"<<std::endl;
}
}
namespace Test2
{
void TestFunc(void)
{
std::cout<<"Test2가 정의한 함수"<<std::endl;
}
}
int main(void)
{
Test::TestFunc();
Test2::TestFunc();
return 0;
}
위 예제에서 ::라는 연산자를 사용했는데 이 연산자는 범위 지정 연산자라 하고 이름 공간을 지정할 때 사용한다.
#include<iostream>
namespace Test
{
void TestFunc(void);
}
namespace Test
{
void TTest(void);
}
namespace Test2
{
void TestFunc(void);
}
int main(void)
{
Test::TestFunc();
Test2::TestFunc();
return 0;
}
void Test::TestFunc(void)
{
std::cout<<"Test가 정의한 함수"<<std::endl;
}
void Test2::TestFunc(void)
{
std::cout<<"Test2가 정의한 함수"<<std::endl;
}
void Test::TTest(void)
{
std::cout<<"Test가 정의한 함수"<<std::endl;
TestFunc(); //같은 이름공간에 있는 함수 호출
Test2::TestFunc(); //다른 이름공간에 있는 함수 호출
}
이렇게 함수를 정의하는 방식으로도 사용이 가능하고 같은 이름 공간에 정의된 함수는 직접 호출이 가능하다. 또한 이름 공간을 중첩해서 사용하는 것 또한 가능하다.
#include<iostream>
namespace Mom
{
int num = 2;
namespace son
{
int num = 3;
}
namespace son2
{
int num = 10;
}
}
이렇게 위의 내용을 잘 이해했다면 의미는 충분히 파악할 수 있을 것이다. num이라는 변수가 총 3개가 존재하는데 각각 선언된 이름 공간이 다르기 때문에 이름 충돌이 발생하지 않는다. 그렇다면 이제 저 각각의 변수 num에는 어떻게 접근할지 궁금할 것이다. 만약 지금 생각난 것이 있다면 그것이 맞을 것이다. 접근하는 방법은 바로
std::cout<< Mom::num <<std::endl;
std::cout<< Mom::son::num <<std:endl;
std::cout<< Mom::son2::num <<std:endl;
위와 같이 접근하면 접근할 수 있다 이것으로 이름 공간에 대한 내용을 조금이라도 이해하길..
'c++' 카테고리의 다른 글
[c++] 기타 연산자 오버로딩 (0) | 2021.01.30 |
---|---|
[c++]참조자 (0) | 2020.11.11 |
[C++]인라인(inline) 함수 (0) | 2020.11.05 |
[C++]매개변수 디폴트 값(Default Value) (1) | 2020.11.05 |