3.5 유니피케이션(Unification)
3.5 유니피케이션(Unification)
유니피케이션은 타입 시스템의 심장이며 Haxe 프로그램의 견고성에 크게 기여해요. 한 타입이 다른 타입과 호환되는지 검사하는 과정을 기술합니다.
정의: 유니피케이션(Unification) — 두 타입 A와 B 사이의 유니피케이션은 "A가 B에 할당될 수 있는가"라는 질문에 답하는 방향성(directional) 있는 과정입니다. 둘 중 하나가 모노모프이거나 모노모프를 가진다면, 어느 한 타입을 변형(mutate)할 수 있어요.
유니피케이션 오류는 매우 쉽게 발생시킬 수 있습니다:
class Main {
static public function main() {
// Int should be String
var s:String = 1;
}
}
Int 타입의 값을 String 타입의 변수에 할당하려 하면, 컴파일러는 Int와 String을 유니파이하려고 시도해요. 이것은 당연히 허용되지 않고, 컴파일러는 Int should be String이라는 오류를 발생시킵니다.
이 특별한 경우 유니피케이션은 할당(assignment) 이라는 문맥에 의해 촉발되는데, "할당 가능"이라는 정의가 직관적인 문맥이에요. 유니피케이션이 수행되는 몇 가지 경우 중 하나입니다:
- 할당(Assignment):
a가b에 할당되면,a의 타입은b의 타입과 유니파이됩니다. - 함수 호출(Function call): 함수(function) 타입을 소개하면서 간단한 예를 보았어요. 일반적으로 컴파일러는 첫 번째 인자 타입을 첫 번째 기대 인자 타입과, 두 번째 인자 타입을 두 번째 기대 인자 타입과 유니파이하며, 모든 인자 타입을 처리할 때까지 이어집니다.
- 함수 반환(Function return): 함수에
return e표현식이 있을 때마다e의 타입은 함수 반환 타입과 유니파이됩니다. 함수가 명시적 반환 표현식을 갖지 않으면return null이 암시된다고 봅니다.null은 유니피케이션 규칙의 관점에서 특별히 취급됩니다. - 배열 선언(array declarations): 배열 리터럴
[a, b, c]의 요소들은 공통 타입으로 유니파이됩니다. 이는 공통 기반 타입(common base type)과 관련됩니다. - 조건부 타입(conditional types):
if/else표현식이나switch의 case 표현식들은 그 결과 타입을 유니파이될 수 있는 브랜치들의 공통 타입으로 결정하려고 합니다.
출처: Unification
본문
유니피케이션의 정의
유니피케이션은 타입 A를 타입 B에 할당할 수 있는지 검사하는 방향성 있는 과정이에요. 참여 타입에 모노모프가 있으면 타입을 변형할 수 있습니다.
유니피케이션이 발생하는 상황
유니피케이션은 할당, 함수 호출(인자 타입 검사), 함수 반환, 배열 선언, if/else나 switch 같은 조건부 타입 결정 등 여러 상황에서 수행됩니다. 컴파일러는 단계적으로 각 인자 타입을 기대 타입과 비교합니다.
오류 예
var s:String = 1;처럼 Int를 String에 할당하면 "Int should be String" 오류가 발생해요. 이는 타입 호환성이 없다는 명확한 신호입니다.