5.23.2 안전한 캐스트(safe cast)
5.23.2 안전한 캐스트(safe cast)
불안전한 캐스트(unsafe casts)와 달리, 안전한 캐스트는 실패 시 런타임 동작이 정의되어 있어요:
class Base {
public function new() {}
}
class Child1 extends Base {}
class Child2 extends Base {}
class Main {
public static function main() {
var child1:Base = new Child1();
var child2:Base = new Child2();
cast(child1, Base); // Ok
cast(child1, Child2); // Exception: Class cast error
}
}
이 예제에서 먼저 Child1 타입의 클래스 인스턴스를 Base로 캐스트하는데, Child1이 Base의 자식 클래스(child class)이므로 성공해요. 그런 다음 같은 클래스 인스턴스를 Child2로 캐스트하려 하는데, Child2의 인스턴스는 Child1의 인스턴스가 아니므로 허용되지 않습니다.
Haxe 컴파일러는 이 경우 String 타입의 예외가 던져진다(throws)는 것을 보장해요. 이 예외는 try/catch 블록으로 잡을 수 있습니다.
안전한 캐스트는 런타임 오버헤드가 있어요. 컴파일러가 이미 타입 검사를 생성하므로, 예를 들어 Std.isOfType이나 is 키워드로 수동 검사를 추가하는 것은 중복이라는 점을 이해하는 것이 중요해요. 의도된 사용법은 안전한 캐스트를 시도하고 String 예외를 잡는 것입니다.
출처: safe cast
본문
안전한 캐스트의 동작
cast(expr, Type)은 대상 타입으로 캐스트하며, 실패하면 String 타입 예외(Class cast error)를 던져요. 상속 관계에 있는 타입으로의 캐스트는 성공합니다.
오버헤드와 중복 검사
안전한 캐스트는 런타임 검사가 있어 오버헤드가 있습니다. 컴파일러가 이미 검사를 하므로 Std.isOfType 같은 수동 검사는 중복이에요. 의도된 사용은 try/catch로 캐스트 실패 예외를 잡는 것입니다.