🌈 프로그래밍/C++

[C++] 1.1.2 namespace

반응형

 

안녕하세요? 수구리입니다!

오늘은 namespace에 대하여 알아보도록 하겠습니다.

 

 

namespace 란?

책에서는 이렇게 정의하고 있습니다.

네임스페이스는 코드에서 이름이 서로 충돌하는 문제를 해결하기 위해 나온 개념이다.

 

만약 A라는 함수를 작성하였는데 어떤 라이브러리에서의 함수 이름이 A 함수로 같은 이름이라면..

 

컴파일러가 어떤 함수인지 구별을 못하니까 문제가 발생하게 되는 것입니다!

 

따라서 namespace를 통해서 어떤 이름이 어디에 속해 있는지에 대한 문맥을 정의하여 문제를 해결할 수 있습니다.

 

바로 이렇게 말이죠

 

// namespace.h

namespace mycode {
	void A();
}

 

이렇듯 namespace는 함수 뿐만 아니라 구현 부분도 묶을 수 있습니다.

 

#include <iostream>
#include "namespace.h"

void mycode::A(){
	std::cout << "A() called in the mycode namespace" << std::endl;
}

 

namespace를 적용한 함수를 호출하려면 앞에 스코프 지정 연산자(scope resolution operator)를 사용하여 함수의 이름 앞에 namespace를 붙입니다.

 


using 지시자

using 지시자를 사용하면 namespace 접두어를 생략할 수 있습니다!

즉, 컴파일러가 using 지시자를 보면 그 뒤에 나오는 문장부터는 using에 지정된 네임 스페이스에 속하는 것으로 처리합니다.

 

예를 들면 다음과 같습니다.

 

#include "namespace.h"

using namespace mycode;

int main() {
	A(); // mycode::A();와 같다
    return 0;
}

 

 

하나의 소스파일에서 using 지시자를 여러 개를 지정할 수 있습니다. 하지만! 이 기능을 너무 남용한다면 결국 namespace를 사용하지 않는 것과 같아지므로 주의해야 합니다. 

 

따라서 현재 코드에서 사용하는 namespace를 명확히 파악해야 합니다.

 

또하나의 주의할 점으로는 

 

헤더 파일 안에서는 절대로 using 문을 사용해서는 안 된다.

그러면 그 헤더 파일을 include 하는 모든 파일에서 using 문으로 지정한 방식으로 호출해야 하기 때문이다.

 


C++17 에서의 중첩된 namespace

중첩된 namespace라.. 우선 개선되어지기 전에 어떻게 작성하였는지 봅시다.

 

namespace MyLibraries {
	namespace Networking {
    	namespace FTP {
        	// To Do
        }
    }
}

 

하지만 아래의 예제에서는 

 

namespace MyLibraries::Networking::FTP{
	// To Do
}

 

와 같이 사용이 가능하게 되었습니다. 그리고 또 C++17 에서는 namespace에 별명을 붙일 수 있도록 하는 

namespace alias가 있습니다. 이를 사용하면 namespace의 이름을 다르게 표현하거나 기존 이름을 좀 더 짧게 만들 수 있다고 합니다.. (근데 이걸 사용할까..?)

 

namespace MyFTP = MyLibraries::Networking::FTP;

 

 

아무튼 오늘은 namespace에 대하여 알아보았습니다. 

 

감사합니다.

반응형

'🌈 프로그래밍 > C++' 카테고리의 다른 글

[C++] 1.1.6 타입  (0) 2021.08.12
[C++] 1.1.5 연산자  (0) 2021.08.12
[C++] 1.1.3 ~ 1.1.4 리터럴과 변수  (2) 2021.08.11
[C++] 1.1.1 Hello World..!  (2) 2021.08.09
[C++] 전문가를 위한 C++ 책을 펼치며..  (5) 2021.08.08