이글은 "전문가를 위한 c++(개정4판)"을 학습한 내용을 직접 실습해보며 정리한 Review용 글입니다.
네임스페이스(namespace)는 코드에서 동일이름이 서로 충돌하는 문제를 해결하기 위해 나온 개념입니다.
예를 들어 foo()라는 함수를 정의를 했는데 기존에 사용한 코드나 라이브러리에 foo()라는 함수가 있다면 간단하게는 이름을 변경하면 되지만 그럴 수 없는 상황이라면 네이스페이스가 그 해결책이 될 수 있습니다.
다음과 같이 mycode라는 네임스페이스로 묶으면 기존 foo() 함수와 서로 구분될 수 있습니다.
namespace mycode
{
void foo();
}
구현 부분도 namespace 공간에 묶여야합니다.
void mycode::foo()
{
std::cout << "반갑습니다" << std::endl;
}
또는 다음과 같이 작성합니다.
namespace mycode
{
void foo() {
std::cout << "반갑습니다" << std::endl;
}
}
네임스페이스 공간에 묶인 함수를 호출할 때는 ::(스코프 지정 연산자)를 이용하여 호출합니다.
mycode::foo();
네임스페이스 블록안에서 호출 할때에는 네임스페이스와 스코프 지정 연산자는 생략해도 됩니다.
만약 외부에서 네임스페이스를 생략하고자 한다면 usign 지시자를 사용하면 됩니다.
namespace mycode
{
void foo() {
std::cout << "반갑습니다" << std::endl;
}
}
using namespace mycode;
int main()
{
foo();
return 0;
}
"Hello, World!" 예제에서 사용한 std::cout은 네임스페이스 std안에 있는 cout이라는 함수를 사용하는 겁니다. std를 생략하고 싶다면 위 예제 처럼 using namespace std;라고 작성하면 됩니다.
네임스페이스 안에 특정한 항목만 가리키도록 using문을 작성할 수 있습니다. 예를 들어 다음과 같이 작성해봅시다.
using std::cout;
cout << "반갑습니다" << std::endl;
위 예제는 std라는 네임스페이스 안에서는 오직 cout 함수만 사용할 수 있습니다. 만일 std 네임스페이스 안에 다른 함수를 사용하고자 한다면 컴파일 에러가 발생합니다. 다음은 std 안에 있는 cin을 사용하는 예제입니다.
using std::cout;
int main()
{
cout << "반갑습니다" << std::endl;
int a;
cin >> a;
return 0;
}
결과
오류(활성) E0020 식별자 "cin"이(가) 정의되어 있지 않습니다.
오류 C2065 'cin': 선언되지 않은 식별자입니다.
std 안에 다름 함수들도 사용하고 싶다면 위의 mycode 예제 처럼 namespace 키워드를 붙여야합니다.
using문 사용시 주의 사항이 있습니다. 만일 헤더 파일 안에서는 using 문을 사용하면 그 헤더파일을 인클루드 하는 모든 파일에서는 using 문으로 지정한 방식으로 호출해야한다는 것입니다. 따라서 가급적 using문은 cpp 파일에 작성해야합니다.
네임스페이스는 중첩으로도 쓸 수 있습니다. C++17 이전까지는 중첩된 네임스페이스는 다음과 같이 작성했습니다.
namespace mycode
{
namespace myLibaries
{
namespace myFunctions
{
/* ......*/
}
}
}
하지만 C++17이후 부터는 다음과 같이 간략하게 쓸 수 있습니다.
namespace mycode::myLibaries::myFunctions
{
/* ......*/
}
사용하는 개발환경에서 C++17 사용설정이 안되어 있다면 다음과 같은 비슷한 오류가 나타날 수 있습니다.
오류C2429 언어 기능 'nested-namespace-definition'에 컴파일러 플래그 '/std:c++17'이(가) 필요합니다.
만약 비주얼 스튜디오 사용자라면 다음과 같이 설정합니다.(vs2019 기준)
속성 페이지에서 C++ 언어 표준을 ISO C++17이상으로 설정합니다.
네임스페이스를 다르게 표현하거나 기존 이름을 더 짧게 표현하고 싶으면 네임스페이스 앨리어스(namespace alias)를 사용하면됩니다. 예를 들면 다음과 같습니다.
namespace Functions = mycode::myLibaries::myFunctions;
'Program Language > c++' 카테고리의 다른 글
C++ 기초(구조체) (0) | 2023.01.03 |
---|---|
c++ 기초(enum) (0) | 2023.01.02 |
c++ 기초(연산자) (0) | 2022.12.29 |
c++ 기초(리터럴 & 변수) (0) | 2022.12.26 |
c++ 기초("Hello, World!") (0) | 2022.12.22 |
댓글