안녕하세요? 수구리입니다!
오늘은 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 |