elaborated_type_specifier — 정교화된 타입 지정자

elaborated_type_specifier — 정교화된 타입 지정자 (Elaborated type specifier)

**정교화된 타입 지정자(elaborated type specifier)**는 이전에 선언된 클래스 이름(class, struct, union)이나 열거형 이름을 참조하는 데 쓰여요. 그 이름이 비타입 선언에 가려져(hidden) 있어도 쓸 수 있어요. 또한 새로운 클래스 이름을 선언하는 데도 쓰여요.

출처: cppreference

본문

문법 (Syntax)

class-key class-name                // (1)
enum enum-name                      // (2)
class-key attr identifier ;         // (3)
  • class-keyclass, struct, union 중 하나
  • class-name — 이전에 선언된 클래스 타입의 이름(선택적으로 한정됨), 또는 아직 타입 이름으로 선언되지 않은 식별자
  • enum-name — 이전에 선언된 열거형 타입의 이름(선택적으로 한정됨)
  • attr — 임의 개수의 속성
struct Node { int value; };
// 이름이 가려진 경우
int Node;  // 변수 Node가 클래스 Node를 가림
struct Node n;  // 정교화된 타입 지정자로 클래스에 접근 (OK)

다음 형태는 새로운 클래스 이름을 선언해요.

struct MyStruct;       // 정방향 선언
class Widget;          // 정방향 선언
union Data { int i; float f; };

정교화된 타입 지정자는 주로 이렇게 쓰여요.

  • 이름 조회에서 클래스 이름이 변수·함수 같은 비타입 선언에 가려졌을 때, 그 클래스를 다시 참조하고 싶을 때
  • 어떤 이름이 타입이 아니라 함수나 변수로 해석될 위험이 있을 때 "이건 타입이다"고 명시적으로 알려 줄 때
  • enum과 함께 써서 열거형 이름을 가린 비타입 이름과 구분할 때

주석이나 특정 오래된 문법(class Foo f;처럼)에서 흔히 보이지만, 현대 C++에서도 "이름이 타입이다"라는 의도를 명확히 할 때 유용해요.

더 알아보기 (Learn more)

cppreference