using_declaration — using 선언

using_declaration — using 선언

**using 선언(using declaration)**은 다른 범위(주로 네임스페이스나 기반 클래스)의 이름을 현재 범위로 가져와 사용할 수 있게 해요.

매번 std::Base::를 붙이기 싫을 때, 또는 기반 클래스의 멤버를 파생 클래스에서 노출하고 싶을 때 사용해요. 특정 이름만 가져온다는 점이 네임스페이스 전체를 여는 using namespace와 달라요.

출처: cppreference

본문

using 선언은 한 범위(네임스페이스 또는 클래스)에서 다른 범위로 하나의 이름(또는 이름 집합)을 가져와요.

문법 (Syntax)

using typename(opt) nested-name-specifier unqualified-id ;
using typename(opt) nested-name-specifier template-name ;
  • nested-name-specifier — 예: std::, Base::
  • unqualified-id — 가져올 이름 (변수, 함수, 타입, 열거자 등)
  • typename — (선택) 의존 타입 이름일 때

네임스페이스에서 이름 가져오기

using std::cout;   // cout 을 현재 범위에
using std::vector; // vector 를 현재 범위에

int main() {
    vector<int> v;
    cout << "hi\n";
}

std:: 접두사를 일일이 쓰지 않아도 돼요. 이렇게 가져온 이름은 바깥 범위의 같은 이름을 가려요.

기반 클래스 멤버 노출

파생 클래스에서 기반 클래스의 멤버를 접근 가능하게 하려면 using 선언을 써요.

struct Base {
    void f(int) {}
};
struct Derived : Base {
    using Base::f;      // Base::f(int) 를 Derived 인터페이스로
    void f(double) {}   // 오버로드
};

정적 멤버/타입 가져오기

struct Base { static int value; using Inner = int; };
struct Derived : Base {
    using Base::value;     // 정적 멤버
    using Base::Inner;     // 타입
};

생성자 상속 (C++11)

using Base::Base;로 기반 클래스 생성자를 상속할 수 있어요.

struct Base { Base(int) {} };
struct Derived : Base {
    using Base::Base;   // Base 의 생성자 상속
};
Derived d(42);  // Derived(42) 가능

using 지시자 (using-directive)와의 차이

  • using 선언: 특정 이름 하나를 가져옴 (using std::cout;)
  • using 지시자: 네임스페이스 전체를 여는 지시 (using namespace std;)

using 지시자는 이름을 가져오는 게 아니라 조회 범위에 네임스페이스를 추가하는 방식이라, 의도하지 않은 이름 충돌을 일으킬 수 있어 선언이 더 권장돼요.

노트 (Notes)

  • using 선언은 새 이름을 만들지 않고 기존 이름을 재노출해요.
  • 중첩된 using 선언으로 여러 범위에서 이름을 합칠 수 있어요.

더 알아보기 (Learn more)

cppreference