자료실/C++

C++ - 네임스페이스(namespace)

자료수집중 2020. 8. 13.
반응형

 

 

 

C++의 입출력 cin과 cout을 하면서  std에 대해서 살짝 알아봤었습니다.

std(standard의 약어) 네임스페이스(namespace)이며 네임스페이스란 C++로 넘어오면서 굉장히 방대한 양의 라이브러리와 식별자들이 나오게 되고 중복이 되는 상황이 발생하게 되면 구분을 할 수 없는 경우가 생깁니다. 이를 해결하기 위해서 나온 개념입니다.

네임스페이스를 사용해서 중복되는 식별자들을 관리할 수 있습니다.

 

namespace

이번에는 네임스페이스에 대해서 알아보겠습니다.

네임스페이스는 직접 선언도 가능합니다.

namespace키워드를 이용해서 직접 네임스페이스를 선언할 수 있습니다.

예제로 네임스페이스를 이용해서 같은 이름의 함수를 사용해보겠습니다. 

#include <iostream>

namespace  Aspace{
	void func() {
		std::cout << "Aspace Hello World \n";
	}
}
namespace  Bspace {
	void func() {
		std::cout << "Bspace Hello World \n";
	}
}

int main()
{
	Aspace::func();
	Bspace::func();

	return 0;
}

네임스페이스 Aspace와 Bspace에 각각 같은이름의 함수 func를 정의했습니다.

main함수에 네임스페이스를 이용해서 같은이름의 함수를 호출했습니다.

같은 이름의 함수지만 네임스페이스가 다르기때문에 에러 없이 정상적으로 실행이 됩니다.

함수뿐만 아니라 변수, 클래스등 식별자는 namespace에 선언할 수 있습니다.

 

 

네임스페이스에 함수원형만 선언하고 main 뒤에서 정의해도 가능합니다.

대신 main뒤에서 함수를 정의할때 네임스페이스를 이용해서 정의해야합니다.

반환형 네임스페이스이름::함수이름(매개변수1, ...)
{

}

예제로 살펴보겠습니다.

#include <iostream>

namespace  Aspace{
	void func(int num);
}
namespace  Bspace {
	void func(int num);
}

int main()
{
	Aspace::func(2);
	Bspace::func(2);
	return 0;
}

void Aspace::func(int num) {
	std::cout << "Aspace num : " << num << '\n';
}
void Bspace::func(int num) {
	std::cout << "Bspace num : " << num << '\n';
}

 

 

네임스페이스 안에 네임스페이스를 선언할 수 있습니다.(중첩이 가능합니다.)

#include <iostream>

namespace  Aspace{
	int value = 100;
	namespace  Bspace {
		void func(int num);
	}
}

int main()
{
	Aspace::Bspace::func(2);
	std::cout << Aspace::value<<'\n';
	return 0;
}

void Aspace::Bspace::func(int num) {
	std::cout << "Aspace::Bspace num : " << num << '\n';
}

 

 

using

네임스페이스를 계속 사용하다보면 중복되는 식별자가 나오지 않는 경우도 생깁니다.

예를 들어 입출력 cin과 cout은 중복되는 식별자가 잘 등장하지 않기때문에 네임스페이스 std를 매번 적는게 굉장히 번거롭습니다.

그래서 네임스페이를 생략 할 수 있는 방법에 대해서 알아보겠습니다.

바로 using을 사용하는 방법입니다.

다음 예제를 살펴보겠습니다.

#include <iostream>

using namespace std;

int main()
{
	cout << "Hello World \n";
	return 0;
}

using으로 namespace std를 선언했습니다.

using은 말 그대로 사용하겠다고 라는 의미입니다.

using namespace std;는 namespace std에 포함된 모든것을 사용하겠다 라는 의미가 됩니다.

 

특정 식별자들만 std를 생략하고싶다면 직접적으로 namespace에 포함된 식별자를 적어주면 됩니다.

#include <iostream>

using std::cout;

int main()
{
	cout << "Hello World \n";
	
	return 0;
}

using std::cout;로 선언하면 cout은 std를 생략할 수 있지만 나머지는 생략할 수 없습니다.

 

using을 사용해서 네임스페이스를 생략할때는 중요한게 중복이 되는 식별자를 네임스페이스를 생략해버리면 에러가 발생합니다.

컴파일러가 어떤 네임스페이스에 소속된거지 모르기때문에 모호하다는 에러를 발생시킵니다.

 

'자료실 > C++' 카테고리의 다른 글

C++ - 클래스(class) 생성자와 소멸자  (0) 2020.08.19
C++ - string 클래스  (0) 2020.08.18
C++ - 클래스(Class)의 구조와 접근 지정자  (0) 2020.08.17
C++ - 입출력  (0) 2020.08.12
C++ - 프로젝트 생성  (0) 2020.08.11

댓글