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>의 구체 타입 매개변수) — 이 매뉴얼의 리뷰어 중 한 명이 위 예제에서
Color와Enum<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>)에 넣는 것은 타입 오류예요. 이는 클래스 인스턴스와 클래스 타입의 관계와 비슷합니다.