본문 바로가기
C++

이름 공간 (namespace)

by KWONE 2024. 7. 17.
#include <iostream>

namespace BestComImpl
{
	void SimpleFunc(void)
	{
		std::cout << "BestCom이 정의한 함수" << std::endl;
	}
}
namespace ProgComImpl
{
	void SimpleFunc(void)
	{
		std::cout << "ProgCom이 정의한 함수" << std::endl;
	}
}
int main(void)
{
	BestComImpl::SimpleFunc();
	ProgComImpl::SimpleFunc();
	return 0;
}

함수 이름이 같아도 이름공간을 다르게 지정하고 함수를 정의하면 충돌없이 사용가능하다.

또한 namespace 블록 안에 꼭 함수를 정의할 필요 없다. 다음과 같이 나타낼 수 있다.

#include <iostream>

namespace BestComImpl
{
	void SimpleFunc(void);
}

namespace ProgComImpl
{
	void SimpleFunc(void);
}

int main(void)
{
	BestComImpl::SimpleFunc();
	ProgComImpl::SimpleFunc();
	return 0;
}


void BestComImpl::SimpleFunc(void)
{
	std::cout<<"BestCom이 정의한 함수"<<std::endl;
}	

void ProgComImpl::SimpleFunc(void)
{
	std::cout<<"ProgCom이 정의한 함수"<<std::endl;
}

참고로 동일한 이름공간(namespace)에 정의되어있는 함수를 호출할 때에는 다시 이름공간을 명시할 필요가 없다. 

#include <iostream>

namespace BestComImpl
{
	void SimpleFunc(void);
}

namespace BestComImpl
{
	void PrettyFunc(void);
}

namespace ProgComImpl
{
	void SimpleFunc(void);
}

int main(void)
{
	BestComImpl::SimpleFunc();
	return 0;
}


void BestComImpl::SimpleFunc(void)
{
	std::cout<<"BestCom이 정의한 함수"<<std::endl;
	PrettyFunc();					// 동일 이름공간
	ProgComImpl::SimpleFunc();		// 다른 이름공간
}	

void BestComImpl::PrettyFunc(void)
{
	std::cout<<"So Pretty!!"<<std::endl;
}

void ProgComImpl::SimpleFunc(void)
{
	std::cout<<"ProgCom이 정의한 함수"<<std::endl;
}

 

이름공간의 중첩

 

이름공간은 중첩할 수도 있다.

namespace Parent
{
	int num=2;
    
    namespace Subone
    {
    	int num=3;
    }
    
    namespace Subtwo
    {
    	int num=4;
    }
}

첫 번째 num은 호출 시 

std::cout<<Parent::num<<std::endl;

두 번째 num은

std::cout<<Parent::Subone::num<<std::endl;

세 번째 num은

std::cout<<Parent::Subtwo::num<<std::endl;

순서대로 2,3,4가 출력된다.

 

std::cout, std::cin, std::endl모두 namespace std에 정의되어있는 함수임을 확인할 수 있다.

이는 각각 "이름공간 std에 선언된 cout", "이름공간 std에 선언된 cin", "이름공간 std에 선언된 endl"을 나타낸다.

using을 이용한 이름공간의 명시

#include <iostream>

namespace Hybrid
{
	void HybFunc(void)
	{
		std::cout<<"So simple function!"<<std::endl;
		std::cout<<"In namespace Hybrid!"<<std::endl;
	}
}

int main(void)
{
	using Hybrid::HybFunc;
	HybFunc();
	return 0;
}
using Hybrid::HybFunc;
	HybFunc();

using을 이용해서 '이름공간 Hybrid에 정의된 HybFunc를 호출할 때에는, 이름공간을 지정하지 않고 호출하겠다.'라고 선언

using 선언을 통해서 이름공간의 지정 없이 HybFunc 함수를 호출하였다.

지역변수 처럼 함수 안에서만 효력을 가지며 전역변수처럼 사용하기 위해서는 함수 바깥에서 using 선언을 하면 된다.

#include <iostream>
using std::cin;
using std::cout;
using std::endl;

int main(void)
{
	int num=20;
	cout<<"Hello World!"<<endl;
	cout<<"Hello "<<"World!"<<endl;
	cout<<num<<' '<<'A';
	cout<<' '<<3.14<<endl;
	return 0;
}

혹은 한번에 이름공간 std에 선언된 모든것에 대해 이름공간 지정의 생략을 선언할 수 있다.

#include <iostream>
using namespace std;

int main(void)
{
	int num=20;
	cout<<"Hello World!"<<endl;
	cout<<"Hello "<<"World!"<<endl;
	cout<<num<<' '<<'A';
	cout<<' '<<3.14<<endl;
	return 0;
}

 

이름공간의 별칭 지정

#include <iostream>
using namespace std;

namespace AAA
{
	namespace BBB
	{
		namespace CCC
		{
			int num1;
			int num2;
		}
	}
}

int main(void)
{
	AAA::BBB::CCC::num1=20;
	AAA::BBB::CCC::num2=30;

	namespace ABC=AAA::BBB::CCC;

	cout<<ABC::num1<<endl;
	cout<<ABC::num2<<endl;
	return 0;
}

이제 ABC는 이름공간 AAA안의 이름공간BBB안의 이름공간 CCC를 나타낸다.

namespace ABC=AAA::BBB::CCC;

	cout<<ABC::num1<<endl;
	cout<<ABC::num2<<endl;

 

**참고사항** 범위지정 연산자

int val=100;		//전역변수

int SimpleFunc(void)
{
	int val=20;	//지역변수
    val+=3;		//지역변수 val의 값 3 증가
    ::val+=7;		//전역변수 val의 값 7 증가
}

전역변수의 이름공간은 보이지는 않지만 이름이 없는 이름공간에 속해있다고 생각할 수 있다.

따라서 ::val은 전역변수val을 나타낸다고 할 수있다.

'C++' 카테고리의 다른 글

정보은닉 (Information Hiding)  (0) 2024.07.26
클래스 (class)  (1) 2024.07.22
C++에서의 구조체  (0) 2024.07.21
scanf를 대신하는 데이터의 입력  (0) 2024.07.15
HELLO WORLD  (0) 2024.07.15