2.3.1 열거 생성자(Enum Constructor)

2.3.1 열거 생성자(Enum Constructor)

클래스와 그 생성자처럼, 열거형도 생성자를 사용해 인스턴스화할 수 있어요. 하지만 클래스와 달리 열거형은 이름으로 접근할 수 있는 여러 생성자를 제공합니다:

var a = Red;
var b = Green;
var c = Rgb(255, 255, 0);

이 코드에서 변수 a, b, c의 타입은 Color예요. 변수 c는 인자를 가진 Rgb 생성자로 초기화됩니다.

모든 열거 인스턴스는 EnumValue라는 특별한 타입에 할당할 수 있어요.

정의: EnumValue — EnumValue는 모든 열거 인스턴스와 유니파이되는 특별한 타입입니다. Haxe 표준 라이브러리가 모든 열거 인스턴스에 대한 연산을 제공하는 데 사용되며, API가 특정 열거형이 아닌 어떤 열거 인스턴스를 요구할 때 사용자 코드에서도 쓸 수 있어요.

열거형 타입과 열거 생성자를 구분하는 것이 중요해요. 다음 예제가 그 차이를 보여줍니다:

enum Color {
  Red;
  Green;
  Blue;
  Rgb(r:Int, g:Int, b:Int);
}

class Main {
  static public function main() {
    var ec:EnumValue = Red; // valid
    var en:Enum<Color> = Color; // valid
    // Error: Color should be Enum
    // var x:Enum = Red;
  }
}

주석 처리된 줄을 주석 해제하면 프로그램이 컴파일되지 않아요. Red(열거 생성자)는 Enum<Color>(열거 타입) 타입의 변수에 할당할 수 없기 때문이죠. 이 관계는 클래스와 그 인스턴스의 관계와 유사합니다.

참고(Enum<T>의 구체 타입 매개변수) — 이 매뉴얼의 리뷰어 중 한 명이 위 예제에서 ColorEnum<Color>의 차이에 혼란을 겪었어요. 실제로 거기에 구체 타입 매개변수를 쓰는 것은 의미가 없고 단지 설명을 위한 것입니다. 보통은 거기서 타입을 생략하고 타입 추론에 맡깁니다.

하지만 추론된 타입은 Enum<Color>와 다를 거예요. 컴파일러는 열거 생성자를 "필드"로 갖는 의사 타입(pseudo-type)을 추론합니다. Haxe 3.2.0 기준으로 이 타입을 문법으로 표현하는 것은 불가능하지만, 그렇게 하는 것이 필요한 경우도 없어요.

출처: Enum Constructor

본문

여러 생성자의 열거형

열거형은 인자를 받지 않는 생성자(Red, Green, Blue)와 인자를 받는 생성자(Rgb(r, g, b))를 함께 가질 수 있어요. 각 생성자는 열거형의 한 변형을 나타냅니다.

EnumValue와 Enum의 구분

  • EnumValue는 모든 열거 인스턴스와 유니파이되는 타입이에요. Red 같은 특정 값을 담을 수 있습니다.
  • Enum<T>는 열거형 타입 자체(예: Color)의 타입이에요.
  • 열거 인스턴스(Red)를 열거 타입(Enum<Color>)에 넣는 것은 타입 오류예요. 이는 클래스 인스턴스와 클래스 타입의 관계와 비슷합니다.

더 알아보기