2.6.3 Any 타입(Any type)
2.6.3 Any 타입(Any type)
Any는 양방향으로 다른 어떤 타입과도 호환되는 타입이에요. 한 가지 목적을 위해 존재하는데, 바로 어떤 타입의 값이라도 담는 것입니다. 코드가 갑자기 동적 타입이 되는 것을 방지하기 위해, 이 값을 사용하려면 명시적 캐스팅이 필요해요. 이 제한은 Haxe의 정적 타이핑을 유지하고, 타입 시스템과 관련된 고급 기능·최적화를 계속 사용할 수 있게 해줍니다.
구현은 아주 간단해요:
abstract Any(Dynamic) from Dynamic to Dynamic {}
Any 타입은 값이 실제로 무엇인지, 필드나 연산을 지원하는지에 대해 가정하지 않아요. 이는 사용자가 처리합니다:
class Main {
static function setAnyValue(value:Any) {
trace(value);
}
static function getAnyValue():Any {
return 42;
}
static function main() {
// value of any type works
setAnyValue("someValue");
setAnyValue(42);
var value = getAnyValue();
$type(value); // Any, not Unknown
// won't compile: no dynamic field access
// value.charCodeAt(0);
if (value is String) {
// explicit promotion, type-safe
trace((value : String).charCodeAt(0));
}
}
}
Any는 필드 접근이나 연산자를 지원하지 않고 모노모프에 바인딩되기 때문에, Dynamic보다 더 타입 안전한 대안이에요. 실제 값으로 작업하려면 명시적으로 다른 타입으로 승격(promote)해야 합니다.
출처: Any type
본문
Any와 Dynamic의 차이
Any는 어떤 타입의 값이든 담을 수 있는 점에서 Dynamic과 비슷하지만, 필드 접근이나 연산자를 지원하지 않아 더 타입 안전해요. Any 타입의 값에 value.charCodeAt(0) 같은 동적 필드 접근은 컴파일되지 않습니다.
명시적 승격
Any 값을 실제로 사용하려면 명시적으로 다른 타입으로 캐스팅(승격)해야 해요. if (value is String)로 타입을 확인한 뒤 (value : String)으로 캐스팅하는 방식이 안전합니다. 이렇게 해야 코드가 조용히 동적 타입이 되어 버리는 것을 방지할 수 있어요.
구현
Any는 Dynamic을 감싼 추상 타입으로, from Dynamic to Dynamic 변환을 선언해 임의의 값과의 상호 호환을 허용합니다.