namespace
- 이름 공간은 어떤 정의된 객체에 대해 어디 소속인지 지정해주는 것
- 코드의 크기가 늘어나고, 다른 사람의 코드를 쓰는 경우가 많아지고 있음
- 중복된 이름을 가진 코드가 많아짐
- c++에서는 이를 구분
- 같은 이름이라도 소속된 이름 공간이 다르면 다른 것으로 취급
- std::cout
- 위의 경우 std라는 이름 공간에 정의된 cout을 의미
이름 공간 정의 방법
// Header1.h
namespace Header1 {
int foo();
void bar();
}
// Header2.h
namespace Header2 {
int foo();
void bar();
}
- 위 코드에서 Header1에 있는 foo는 Header1이라는 이름 공간에 foo가 된다.
- Header2에 있는 foo의 경우 Header2라는 이름 공간에 foo가 된다.
- 자기 자식이 포함되어 있는 이름 공간 안에서는 굳이 앞에 이름 공간을 명시하지 않고 자유롭게 부를 수 있음
#include "Header1.h"
namespace Header1 {
int func()
{
foo(); // 알아서 Header1::foo()가 실행
}
} // end of Header1
- Header1 이름 공간안에서 foo를 부른다면 알아서 Header1::foo()를 호출한다.
- 또한, Header1 이름 공간안에서 Header2의 foo를 호출할 수 있다.
#include "Header1.h"
#include "Header2.h"
namespace Header1 {
int func()
{
foo();
Header2::foo();
}
} // end of Header1
- 함수가 포함되어 있는 이름 공간을 호출할 때마다 알려주는 것은 귀찮은 일
#include "Header1.h"
#include "header2.h"
using namespace header1;
int main()
{
foo(); // header1 에 있는 함수를 호출
bar(); // header1 에 있는 함수를 호출
}
- using namespace를 사용해서 header1 이름 공간에 있는 함수를 호출 할 수 있음
using에 대한 주의 사항
- using namespace std; 와 같이 어떠한 이름 공간을 사용하겠다고 선언하는 것은 권장되지 않음
- std에 이름이 겹치는 함수를 만들게 된다면, 오류가 발생하기 때문
- 또한, C++ 표준 라이브러리는 매우 거대하므로, 정말 수 많은 함수들이 존재
- 이름이 겹치게 된다면, 수정에 많은 시간이 소요된다.
- std에는 매번 수 많은 함수들이 새롭게 추가
- C++ 버전이 바뀔 때 마다 이름 충돌로 인해 동작하지 않을 수 있음
- 권장되는 방식은 std::를 직접 앞에 붙여 std의 이름 공간의 함수이다 라고 명시해주는 것이 좋음
이름 없은 이름 공간
- C++에서는 이름 공간에 굳이 이름을 설정하지 않아도 된다.
- 이 경우 해당 이름 공간에 정의된 것은 해당 파일 안에서만 접근할 수 있음
- static 키워드를 사용한 것과 같은 효과
#include <iostream>
namespace {
int OnlyInThisFile() {}
int onlyInThisFileVariable = 0;
int main()
{
OnlyInThisFile();
onlyInThisFileVariable = 3;
}
}
출처
'C++' 카테고리의 다른 글
[C++] explicit와 mutable (0) | 2024.12.16 |
---|---|
[C++] 참조자 (0) | 2024.12.16 |
[C++] Override와 final 키워드 (0) | 2024.12.13 |
[C++] 구조적 바인딩 (0) | 2024.12.13 |
[C++] 람다 함수 (1) | 2024.12.13 |