6.10 메타데이터(Metadata)

6.10 메타데이터(Metadata)

여러 구조에 사용자 정의 메타데이터를 붙일 수 있어요:

  • classenum 선언
  • 클래스 필드
  • enum 생성자
  • 표현식

이 메타데이터 정보는 런타임에 haxe.rtti.Meta API를 통해 얻을 수 있습니다:

import haxe.rtti.Meta;

@author("Nicolas")
@:keep
class MyClass {
  @range(1, 8)
  var value:Int;

  @broken
  static function method() {}
}

class Main {
  static public function main() {
    // { author : ["Nicolas"] }
    trace(Meta.getType(MyClass));
    // [1,8]
    trace(Meta.getFields(MyClass).value.range);
    // { broken: null }
    trace(Meta.getStatics(MyClass).method);
  }
}

선행 @ 문자, 메타데이터 이름, 그리고 선택적으로 괄호 안의 쉼표로 구분된 상수 인자 수로 메타데이터를 쉽게 식별할 수 있어요.

클래스 MyClass는 단일 String 인자 "Nicolas"를 가진 author 메타데이터와 인자 없는 :keep 메타데이터를 가집니다.

멤버 변수 value는 두 Int 인자 18을 가진 range 메타데이터를 가집니다.

static 메서드 method는 인자 없는 broken 메타데이터를 가집니다.

main 메서드는 API를 사용해 이 메타데이터 값들에 접근합니다. 출력은 얻은 데이터의 구조를 드러냅니다:

  • 각 메타데이터마다 필드가 있고, 필드 이름이 메타데이터 이름입니다.
  • 필드 값은 메타데이터 인자에 대응합니다. 인자가 없으면 필드 값은 null이고, 그렇지 않으면 인자당 하나의 요소를 가진 배열입니다.

메타데이터 인자로 허용되는 값은 다음과 같아요:

컴파일 타임 메타데이터(Compile-time Metadata)

@:keep처럼 :로 시작하는 메타데이터는 컴파일 타임에만 사용할 수 있고, 런타임에는 생략됩니다. 매크로나 Haxe 컴파일러 자체가 사용할 수 있어요. 런타임 메타데이터와 달리 컴파일 타임 메타데이터의 인자는 어떤 유효한 표현식이든 될 수 있습니다.

내장 컴파일러 메타데이터(Built-in Compiler Metadata)

정의된 모든 메타데이터의 전체 목록은 명령줄에서 haxe --help-metas를 실행해 얻을 수 있어요.

Haxe 4.0.0 이후 — Haxe 4 이전에는 메타데이터 이름이 유효한 식별자여야 했습니다. Haxe 4부터 메타데이터 이름은 . 기호로 구분된 여러 식별자로 구성될 수 있어요. 이 변경은 주로 컴파일 타임 메타데이터를 쉽게 조직하기 위한 것입니다. 이런 이름을 가진 런타임 메타데이터는 dynamic 접근으로만 접근할 수 있어요.

관련 콘텐츠(Related content)컴파일러 메타데이터 목록(Compiler Metadata list)도 참조하세요.

출처: Metadata

본문

메타데이터 기본

@이름(인자...) 형태로 클래스, 필드, enum 생성자, 표현식에 붙입니다. haxe.rtti.Meta API로 런타임 조회가 가능합니다. 인자는 상수, 배열, 객체여야 해요.

컴파일 타임 vs 런타임

:로 시작하는 메타데이터(@:keep)는 컴파일 타임 전용이며 런타임에 생략됩니다. 인자에 임의 표현식이 허용됩니다. haxe --help-metas로 전체 목록을 볼 수 있어요.

Haxe 4의 변경

메타데이터 이름이 .로 구분된 여러 식별자를 허용하게 되었습니다.

더 알아보기