3.6 타입 추론(Type Inference)
3.6 타입 추론(Type Inference)
타입 추론의 효과는 이 문서 전반에 걸쳐 보아 왔고, 앞으로도 계속 중요할 거예요. 간단한 예제가 타입 추론이 동작하는 모습을 보여줍니다:
class Main {
public static function main() {
var x = null;
$type(x); // Unknown
x = "foo";
$type(x); // String
}
}
특수 구조 $type은 함수 타입(Function Type)에 대한 설명을 단순화하기 위해 앞서 언급했어요. 이제 공식적으로 소개할게요:
정의: $type —
$type은 함수처럼 인자 하나를 받아 호출되는 컴파일 타임 메커니즘입니다. 컴파일러는 인자 표현식을 평가한 뒤 그 표현식의 타입을 출력해요.
위 예제에서 첫 $type은 Unknown<0>을 출력해요. 이것은 모노모프(monomorph), 즉 아직 알려지지 않은 타입입니다. 다음 줄 x = "foo"는 x에 String 리터럴을 할당하는데, 이는 모노모프와 String의 유니피케이션(unification)을 일으켜요. 그러면 x의 타입이 String으로 바뀐 것을 볼 수 있습니다.
Dynamic이 아닌 다른 타입이 모노모프와 유니파이될 때마다, 그 모노모프는 그 타입으로 모프(morph), 즉 더 간단히 말해 그 타입이 됩니다. 따라서 나중에 다른 타입으로 모프할 수 없어요. 이것은 이름에서 mono(하나)라는 부분에 표현된 속성입니다.
유니피케이션 규칙을 따라, 타입 추론은 복합 타입에서도 발생할 수 있어요:
class Main {
public static function main() {
var x = [];
$type(x); // Array<Unknown<0>>
x.push("foo");
$type(x); // Array<String>
}
}
변수 x는 먼저 빈 Array로 초기화돼요. 이 시점에서 x의 타입이 배열이라는 것은 알 수 있지만, 배열 요소의 타입은 아직 모릅니다. 따라서 x의 타입은 Array<Unknown<0>>이에요. 배열에 String을 push한 뒤에야 타입이 Array<String>임을 알게 됩니다.
출처: Type Inference
본문
$type과 모노모프
$type(expression)은 컴파일 타임에 표현식의 타입을 출력하는 특수 구조예요. 아직 결정되지 않은 타입은 모노모프이며 Unknown으로 표시되고, 값이 할당되면 그 타입으로 확정됩니다.
모노모프의 모핑
모노모프는 비-Dynamic 타입과 유니파이되면 그 타입으로 확정되며, 이후 다른 타입으로 바뀌지 않아요. 그래서 이름에 "mono"(하나)가 들어간 것입니다.
복합 타입에서의 추론
타입 추론은 요소를 가진 복합 타입에도 적용돼요. 빈 Array는 먼저 Array<Unknown>으로 추론되고, String을 push하면 Array<String>으로 확정됩니다.