3.2 타입 매개변수(Type Parameters)

3.2 타입 매개변수(Type Parameters)

Haxe는 여러 타입뿐 아니라 클래스 필드(class fields)열거 생성자(enum constructors)의 매개변수화를 허용해요. 타입 매개변수는 쉼표로 구분된 이름을 꺾쇠괄호 <>로 둘러싸 정의합니다. Haxe 표준 라이브러리의 간단한 예는 Array입니다:

class Array<T> {
  function push(x : T) : Int;
}

Array의 인스턴스가 생성될 때마다, 그 타입 매개변수 T모노모프(monomorph)가 돼요. 즉 어떤 타입이든 바인딩될 수 있지만, 한 번에 하나만 바인딩됩니다. 이 바인딩은 두 가지 방식으로 일어날 수 있어요:

  • 명시적으로: 명시적 타입으로 생성자를 호출해(new Array<String>()) 바인딩.
  • 암시적으로: 예를 들어 arrayInstance.push("foo")를 호출할 때 타입 추론으로 바인딩.

타입 매개변수를 가진 클래스의 정의 안에서 타입 매개변수는 특정되지 않은 타입이에요. 제약(constraints)이 추가되지 않으면, 컴파일러는 타입 매개변수가 어떤 타입과도 함께 쓰일 수 있다고 가정해야 합니다. 결과적으로 타입 매개변수의 필드에 접근하거나 타입 매개변수 타입으로 캐스팅(cast)하는 것은 불가능해요. 타입 매개변수가 제네릭(generic)이고 그에 맞게 제약되지 않는 한, 타입 매개변수 타입의 새 인스턴스를 만드는 것도 불가능합니다.

다음 표는 타입 매개변수가 어디에 허용되는지 보여줘요:

매개변수 대상 바인딩 시점 참고
클래스 인스턴스화 멤버 필드에 접근할 때에도 바인딩될 수 있음
인스턴스 필드 클래스가 인스턴스화될 때 타입 매개변수를 가질 수 있음
정적 필드 타입 매개변수를 가질 수 없음
메서드 타입 매개변수를 가질 수 있으며, 호출 시 바인딩됨
열거형 타입 매개변수를 가질 수 있음
열거 생성자 타입 매개변수를 가질 수 있음
인터페이스 타입 매개변수를 가질 수 있음
typedef 타입 매개변수를 가질 수 있음

출처: Type Parameters

본문

타입 매개변수의 기본

타입 매개변수는 <> 안에 이름을 나열해 정의해요. Array<T>에서 T가 그것이에요. 인스턴스화되면 T는 모노모프가 되어 어떤 타입이든 하나로 바인딩됩니다.

명시적/암시적 바인딩

타입 매개변수는 new Array<String>()처럼 명시적으로, 또는 array.push("foo")처럼 타입 추론을 통해 암시적으로 바인딩될 수 있어요.

타입 매개변수에 대한 제약

제약이 없는 타입 매개변수는 어떤 타입이든 될 수 있다고 가정돼요. 그래서 타입 매개변수의 필드 접근, 타입 매개변수로의 캐스팅, new T() 같은 타입 인스턴스 생성은 제네릭이 아니면 불가능합니다.

허용 위치

타입 매개변수는 클래스, 인스턴스 필드, 메서드, 열거형, 열거 생성자, 인터페이스, typedef에 허용되지만, 정적 필드에는 허용되지 않아요.

더 알아보기