본문 바로가기

C++/C++ 문법

[C++] 이름공간 (namespace)

728x90
반응형

namespace

 

이름공간이란 코드에 이름을 붙여주기 위한 장치라고 생각하면 좋다.

 

예를 들어 두 개의 팀이 협업을 할 때 서로의 팀에서 변수나 함수명이 겹치는 것을 방지하기 위해서 사용할 수 있다.

 

예를 들어 팀 A와 팀 B의 코드를 구분하기 위해 두 개의 네임스페이스를 코드로 작성해보겠다.

 

namespace TeamA
{
	int a;
	int b;
	int sum(int a, int b)
	{
		return a + b;
	}
}

namespace TeamB
{
	int a;
	int b;
	int c;
	int sum(int a, int b, int c)
	{
		return a + b + c;
	}
}

 

위와 같이 네임스페이스를 선언하면 같은 변수라도 구분해서 사용하는 것이 가능하다.

 

 

 

 

네임스페이스로 구분한 변수나 함수를 사용하기 위해서는 :: 연산자를 사용한다.

 

네임스페이스의 이름 뒤에 :: 연산자를 붙이고 사용할 변수나 함수명을 작성하면 된다.

 

이를 코드로 작성해보면 다음과 같다.

 

	std::cin >> TeamA::a;
	std::cin >> TeamA::b;
	std::cout << TeamA::sum(TeamA::a, TeamA::b) << std::endl;

	std::cin >> TeamB::a;
	std::cin >> TeamB::b;
	std::cin >> TeamB::c;
	std::cout << TeamB::sum(TeamB::a, TeamB::b, TeamB::c) << std::endl;

 

 

 

 

 

최종적으로는 아래 코드와 같이 완성할 수 있을 것이다.

 

#include <iostream>

namespace TeamA
{
	int a;
	int b;
	int sum(int a, int b)
	{
		return a + b;
	}
}

namespace TeamB
{
	int a;
	int b;
	int c;
	int sum(int a, int b, int c)
	{
		return a + b + c;
	}
}

int main()
{
	std::cin >> TeamA::a;
	std::cin >> TeamA::b;
	std::cout << TeamA::sum(TeamA::a, TeamA::b) << std::endl;

	std::cin >> TeamB::a;
	std::cin >> TeamB::b;
	std::cin >> TeamB::c;
	std::cout << TeamB::sum(TeamB::a, TeamB::b, TeamB::c) << std::endl;

	return 0;
}

 

 

 

 

 

 

 

 

 

 

 

 

이름공간에서의 함수 선언과 정의 구분

 

네임스페이스 기반에서 함수를 선언할 때에도 선언과 정의를 구분할 수 있다.

 

네임스페이스 안쪽에서 함수의 선언을 진행하고 네임스페이스 바깥쪽에서 정의를 진행하면 된다.

 

정의를 할 때에는 함수명 앞쪽에 네임스페이스의 이름을 :: 연산자를 통해 명시해주면 된다.

 

이를 코드로 확인해보면 다음과 같다.

 

namespace TeamA
{
	int sum(int a, int b);
}


int TeamA::sum(int a, int b)
{
	return a + b;
}

 

 

 

 

 

 

이 때 같은 네임스페이스에서 정의된 변수나 함수 등은 네임스페이스 명시없이 사용이 가능하다.

 

이를 코드로 확인해보면 다음과 같다.

 

#include <iostream>

namespace TeamA
{
	int a = 10;
	int b = 20;
	int sum();
	void print();
}

int main()
{
	std::cout << TeamA::sum() << std::endl;

	return 0;
}

int TeamA::sum()
{
	print();
	return a + b;
}

void TeamA::print()
{
	std::cout << "  TeamA Sum함수  " << std::endl;
}

 

TeamA::sum() 을 정의할 때 변수 a, b와 print() 함수를 네임스페이스 명시 없이 사용하는 것을 볼 수 있다.

 

 

 

 

 

 

 

 

 

 

 

이름공간의 분리

 

네임스페이스는 둘 이상의 영역에 나눠서 선언하는 것도 가능하다.

 

namespace TeamA
{
	int a = 10;
	int b = 20;
}


namespace TeamA
{
	int sum();
	void print();
}

 

공간이 분리되었더라도 네임스페이스의 이름이 같다면 동일공간으로 간주한다.

 

 

 

 

 

 

 

 

이름공간의 중첩

 

네임스페이스를 중첩하여 사용하는 것 또한 가능하다.

 

namespace TeamA
{
	namespace var
	{
		int a = 10;
		int b = 20;
	}

	namespace func
	{
		int sum();
		void print();
	}
}

 

 

중첩된 공간에 접근하는 방법도 간단하다.

 

가장 바깥쪽 네임스페이스부터 ::연산자를 통해 접근해주면 된다.

 

따라서 sum 함수를 실행시키려고 한다면 다음과 같이 작성할 수 있을 것이다.

 

TeamA::func::sum();

 

 

 

 

 

그러나 중첩을 통해 변수와 함수를 분리함에 따라 함수를 선언할 때 변수의 이름공간을 명시해줄 필요가 생겼다.

 

따라서 전체적인 코드는 다음과 같이 바뀔 것이다.

 

#include <iostream>

namespace TeamA
{
	namespace var
	{
		int a = 10;
		int b = 20;
	}

	namespace func
	{
		int sum();
		void print();
	}
}

int main()
{
	std::cout << TeamA::func::sum() << std::endl;

	return 0;
}

int TeamA::func::sum()
{
	print();
	return TeamA::var::a + TeamA::var::b;
}

void TeamA::func::print()
{
	std::cout << "  TeamA Sum함수  " << std::endl;
}

 

 

 

 

 

 

 

 

728x90
반응형