컴퓨터 공학 일지/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;