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선언으로 여러 범위에서 이름을 합칠 수 있어요.