본문 바로가기
Programming/C,C++

[C++] #3 이름공간(Name Space)의 사용방법

by yoiii 2020. 12. 23.

Goal

1. 이름공간이 필요한 이유와, 사용방법에 대한 이해

2. using 키워드의 사용방법

3. 이름공간에 별칭을 지정하는 방법

4. 범위지정 연산자로 전역변수에 접근


● 이름공간(Name Space)


이름공간이 필요한 이유와, 사용방법에 대해 알아보자.

이름공간이란, "이름을 붙여놓은 공간" 이라는 뜻이다. 말 그대로 특정한 영역에 이름을 붙여주기 위한 문법이다.

그렇다면 이름공간이 왜 필요한 것일까?

 

A회사와 B회사가 같이 프로젝트를 진행하고 있다고 생각해 보자.

A회사에서 MySum 이라는 함수를 사용하고 있다.

그런데 B회사와의 사전협의가 진행되지 않아 B회사도 MySum이라는 동일한 함수를 정의하고 말았다.

 

중복되는 함수나 변수의 이름을 모두 변경하는 해결책도 있겠지만, 이것은 비효율적이며 근본적인 해결책이 되지 못한다.

 

따라서 C++은 이름공간 이라는 문법을 제시한다.

 

void mySum(void) {
	std::cout << "A_company_Function" << std::endl;
}

void mySum(void) {
	std::cout << "B_company_Function" << std::endl;
}

int main() {
	mySum();
	return 0;
}

 

앞서, 말한 상황을 코드로 표현해 보았다.

각 회사에서 정의한 mySum 이라는 함수가 중복되어, 이름충돌이 발생하고 말았다.

 

namespace A_company {
	void mySum(void) {
		std::cout << "A_company_Function" << std::endl;
	}
}

namespace B_company {
	void mySum(void) {
		std::cout << "B_company_Function" << std::endl;
	}
}

int main() {
	A_company::mySum();
	B_company::mySum();
	return 0;
}

 

다음과 같이, namespace 키워드를 이용해 이름공간을 지정해 주면 문제를 해결할 수 있다

 

A_company::mySum();

여기서 :: 는 '범위지정 연산자' 라고 하는데, 이름공간을 지정할 때 사용하는 연산자이다.

A_company 이름공간의 mySum 함수를 사용하겠다. 라는 의미이다.

 


 

● using keyword 을 이용한 이름공간 명시


using 키워드를 사용하면, 이름공간을 지정하지 않고 호출이 가능하다.

 

#include <iostream>
using namespace MyFunc;

namespace MyFunc {
	void mySum(void) {
		std::cout << "My_Function" << std::endl;
	}
}

int main() {
	mySum();
	return 0;
}

 

using namespace MyFunc;

 

다음 코드는 "MyFunc 이름공간을 지정하지 않고, 사용하겠다." 라는 의미이다. 

본래라면, main함수에서 mySum 함수를 사용할 때, 앞에 이름공간을 붙여서

MyFunc::mySum 과 같은 형태로 사용해야 했겠지만, using 키워드를 사용하면 앞의

MyFunc:: 부분을 생략할 수가 있다.

 

int main() {
	std::cout << "Hello World!" << std::endl;
	return 0;
}

 

 

앞서 살펴본 cout, cin, endl 도 마찬가지이다.

std::cout"std이름공간에 정의된 cout를 사용하고 싶어" 라는 뜻이기에,

std 이름공간을 사용하겠다고 using 키워드를 이용해 정의하면

 

using namespace std;

int main() {
	cout << "Hello World!" << endl;
	return 0;
}

 

다음과 같이 앞의 std::를 생략이 가능하다.

 


● 이름공간에 별칭 지정하기


이름공간에는 별칭이라는 것을 지정이 가능하다.

예를들어 다음과 같이 이름공간이 3중첩되는 상황이 생겼다고 생각해보자.

 

using namespace std;

namespace A {
	namespace B {
		namespace C {
			void myFunc(void) {
				cout << "Hello" << endl;
			}
		}
	}
}

 

myFunc 함수를 사용하기 위해선,

A::B::C 이렇게 지정을 해줘야 하는데, 이는 매우 번거롭고, 겉으로 보기에도 더럽다.

 

 

using namespace std;

namespace A {
	namespace B {
		namespace C {
			void myFunc(void) {
				cout << "Hello" << endl;
			}
		}
	}
}

int main() {
	namespace ABC = A::B::C;
	ABC::myFunc();
}

 

namespace 별칭이름 = 이름공간::이름공간..; 

이렇게 이름공간에 별칭을 지정해주면, 지정한 별칭만으로, 각 이름공간에 접근이 가능하다.

 


● 범위지정연산자로 전역변수 접근하기


다음으로 범위지정연산자(::)의 또다른 기능에 대해서 살펴보도록 하자.

기본적으로, 전역변수는 새롭게 정의된 지역변수와 이름이 동일하다면, 무시된다.

 

int val1 = 100;

int main() {
	int val1 = 10;
	val1 += 1;
}

 

이런 상황에서, 범위지정연산자 :: 를 이용하면,

 

int val1 = 100;

int main() {
	int val1 = 10;
	val1 += 1;
	::val1 += 1;
}

 

지역변수가 아닌, 전역변수의 값이 증가하게 된다.


 

댓글