주간 팁 #119: using
선언과 네임스페이스 별칭 사용하기
원래 게시일: 2016-07-14
작성자: Thomas Köppe (tkoeppe@google.com)
이 팁은 .cc
파일에서 using
선언과 네임스페이스 별칭을 작성할 때 발생할 수 있는 미묘한 문제를 피하기 위한 간단하고 견고한 방법을 제공합니다.
요약
권장사항:
- 헤더 파일에서 네임스페이스 별칭이나
using
선언을 사용하지 마십시오.- 이러한 별칭은 구현자나 구현을 읽는 사람을 위한 편의 기능으로만 사용되어야 하며, 내보내는 API의 일부가 아닙니다.
- 별칭 선언은 가장 안쪽 네임스페이스(익명 네임스페이스 포함) 안에 배치하십시오.
- 별칭 선언을 위해 익명 네임스페이스를 새로 만들지 마십시오.
- 별칭을 선언할 때 항상 완전히 수식된 이름(앞에
::
가 붙은 이름)을 사용하십시오.- 단, 현재 네임스페이스 안의 이름을 참조하는 경우는 예외입니다.
- 다른 이름을 사용할 때는 불필요한 완전 수식을 피하십시오.
- 관련 정보는 TotW 130에서 확인하세요.
배경
C++는 이름을 네임스페이스로 구성합니다.
이 기능은 코드베이스가 커지더라도 이름 충돌을 방지하며, 소유 범위를 명확히 합니다. 그러나 네임스페이스는 종종 foo::Bar
처럼 긴 이름을 만들게 되어 코드가 복잡해질 수 있습니다. 이를 완화하기 위해 짧은 미수식 이름(Bar
)을 사용하는 것이 유용하며, 긴 네임스페이스를 별칭으로 정의하는 방법(namespace eu = example::v1::util
)도 자주 사용됩니다.
문제
1. 별칭의 범위 문제
- 별칭의 위치는 코드 유지 관리에 중요한 영향을 미칠 수 있습니다.
예를 들어:
using ::foo::Quz;
namespace example {
namespace util {
using ::foo::Bar;
Quz
는::example::util
안에서 사용 가능하지만, 헤더 파일이 새로 포함되거나 네임스페이스 충돌이 발생하면 문제가 생길 수 있습니다.- 별칭을 네임스페이스 내부에 배치하면 이러한 충돌 가능성을 줄일 수 있습니다.
2. 상대적인 이름 사용 문제
- 예를 들어,
using foo::Bar
는 모호할 수 있습니다. - 현재 네임스페이스와 동일한 이름을 포함하거나, 다른 네임스페이스가 추가되면 이 선언이 깨질 수 있습니다.
- 완전 수식된 이름(
using ::foo::Bar
)을 사용하면 이 문제를 방지할 수 있습니다.
익명 네임스페이스 사용하기
익명 네임스페이스에 별칭 선언을 배치하면, 다음과 같은 이점이 있습니다:
- 충돌 가능성이 줄어듭니다.
- 별칭 선언이 파일의 논리적 구성을 유지합니다.
예:
namespace example {
namespace util {
namespace {
// 모든 `using` 선언을 여기에 모읍니다.
using ::foo::Bar;
using ::foo::Quz;
} // namespace
// 이제 이곳에서도 `Bar`와 `Quz`를 사용할 수 있습니다.
결론
- 헤더 파일에는 절대
using
선언을 하지 마십시오. - 완전히 수식된 이름을 사용하는 것이 안전하며, 가능한 경우 익명 네임스페이스를 활용하십시오.
- 이 가이드를 따르면 유지보수성과 코드 안전성이 높아질 것입니다.