[C++]이름공간

2020. 11. 7. 20:54c++

[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