3.7.1 모듈 하위 타입(Module Sub-Types)

3.7.1 모듈 하위 타입(Module Sub-Types)

모듈 하위 타입은 모듈과 다른 이름으로 그 모듈 안에 선언된 타입이에요. 이는 단일 .hx 파일이 여러 타입을 담을 수 있게 해주고, 모듈 안에서는 한정 없이, 다른 모듈에서는 package.Module.Type으로 접근할 수 있습니다:

var e:haxe.macro.Expr.ExprDef;

여기서 모듈 haxe.macro.Expr 안의 하위 타입 ExprDef에 접근하고 있어요.

하위 타입 선언의 예는 다음과 같아요:

// a/A.hx
package a;

class A { public function new() {} }
// sub-type
class B { public function new() {} }
// Main.hx
import a.A;

class Main {
    static function main() {
        var subtype1 = new a.A.B();

        // these are also valid, but require import a.A or import a.A.B :
        var subtype2 = new B();
        var subtype3 = new a.B();
    }
}

하위 타입 관계는 런타임에 반영되지 않아요. public 하위 타입은 포함하는 패키지의 멤버가 되는데, 같은 패키지의 두 모듈이 같은 하위 타입을 정의하려 하면 충돌이 생길 수 있어요. 당연히 Haxe 컴파일러는 이런 경우를 감지해 보고합니다. 위 예제에서 ExprDefhaxe.macro.ExprDef로 생성됩니다.

하위 타입은 private으로 만들 수도 있어요:

private class C { ... }
private enum E { ... }
private typedef T { ... }
private abstract A { ... }

정의: private 타입(Private type)private 수정자를 사용하면 타입을 private으로 만들 수 있어요. 그러면 그 타입은 정의된 모듈 안에서만 직접 접근할 수 있습니다.

private 타입은 public 타입과 달리 포함하는 패키지의 멤버가 되지 않아요. 그 대신 컴파일러가 생성하는 익명(anonymous) 타입 식별자를 사용해 접근됩니다.

출처: Module Sub-Types

본문

하위 타입이란

모듈 하위 타입은 모듈과 다른 이름으로 그 모듈 안에 선언된 타입이에요. 같은 .hx 파일에 여러 타입을 둘 수 있고, 모듈 안에서는 한정 없이, 밖에서는 package.Module.Type으로 접근합니다.

접근 방법

new a.A.B()처럼 전체 경로로 접근하거나, import a.Anew B()처럼 접근할 수 있어요.

특징

하위 타입 관계는 런타임에 반영되지 않으며, public 하위 타입은 포함 패키지의 멤버가 돼요. 같은 패키지에서 같은 하위 타입을 중복 정의하면 컴파일러가 오류를 보고합니다.

private 하위 타입

private 수정자로 하위 타입을 private으로 만들면 정의된 모듈 안에서만 직접 접근할 수 있어요.

더 알아보기