2.7.5 열거 추상(Enum abstracts)

2.7.5 열거 추상(Enum abstracts)

Haxe 3.1.0 이후 — 추상 정의에 @:enum 메타데이터를 추가하면, 그 추상으로 유한한 값의 집합을 정의할 수 있어요:

@:enum
abstract HttpStatus(Int) {
  var NotFound = 404;
  var MethodNotAllowed = 405;
}

class Main {
  static public function main() {
    var status = HttpStatus.NotFound;
    var msg = printStatus(status);
  }

  static function printStatus(status:HttpStatus) {
    return switch (status) {
      case NotFound:
        "Not found";
      case MethodNotAllowed:
        "Method not allowed";
    }
  }
}

Haxe 컴파일러는 HttpStatus 추상에 대한 모든 필드 접근을 그 값으로 대체합니다. JavaScript 출력에서 확인할 수 있어요:

Main.main = function() {
    var status = 404;
    var msg = Main.printStatus(status);
};
Main.printStatus = function(status) {
    switch(status) {
    case 404:
        return "Not found";
    case 405:
        return "Method not allowed";
    }
};

이것은 인라인으로 선언된 변수에 접근하는 것과 비슷하지만 몇 가지 장점이 있어요:

  • 타입 검사기가 집합의 모든 값이 올바르게 타입 지정되었는지 확인할 수 있습니다.
  • 패턴 매처는 열거 추상을 매칭할 때 철저성(exhaustiveness)을 검사합니다.
  • 필드 정의에 더 적은 문법이 필요해요.

Haxe 4.0.0 이후 — 열거 추상은 @:enum 메타데이터 없이, 더 자연스러운 문법 enum abstract로 선언할 수 있어요. 또한 기반 타입이 String이나 Int라면 열거 case의 값을 생략할 수 있고 컴파일러가 추론합니다:

  • Int 추상의 경우, 추론된 값은 마지막 사용자 정의 값을 1씩 증가시키며, 아무 값도 선언되지 않았으면 0에서 시작합니다.
  • String 추상의 경우, 추론된 값은 열거 case의 식별자입니다.
enum abstract Numeric(Int) {
  var Zero; // implicit value: 0
  var Ten = 10;
  var Eleven; // implicit value: 11
}

enum abstract Textual(String) {
  var FirstCase; // implicit value: "FirstCase"
  var AnotherCase; // implicit value: "AnotherCase"
}

출처: Enum abstracts

본문

@:enum 추상의 개념

@:enum 메타데이터를 붙인 추상은 유한한 값 집합을 정의해요. 각 필드는 상수 값을 가지며, 컴파일러가 접근을 값으로 대체합니다. 기반 타입이 Int라면 각 case의 값이 실제 정수로 치환돼요.

장점

열거 추상은 인라인 변수 접근과 비슷하지만, 값의 타입 검사, 패턴 매칭의 철저성 검사, 더 간결한 문법이라는 장점이 있어요.

Haxe 4의 변화

Haxe 4.0.0부터는 enum abstract 문법으로 더 자연스럽게 선언할 수 있고, Int/String 기반 타입에서는 값을 생략할 수 있어요. 컴파일러가 마지막 값에서 1씩 증가시키거나(Int), case 식별자를 값으로 사용합니다(String).

더 알아보기