타입 추론 (type inference)
쉽게 풀면
타입 추론은 컴파일러가 마치 탐정처럼 코드 안의 단서들을 종합해 각 변수와 표현식의 타입을 스스로 알아내는 기능이다. 예를 들어 'x = 3 + 5'라고만 써도, 3과 5가 정수이고 더하기 연산의 결과도 정수이므로 x 역시 정수 타입이라는 것을 컴파일러가 자동으로 추론해준다. 이 덕분에 프로그래머는 정적 타이핑의 안전성(오류를 미리 잡아내는 이점)을 누리면서도, 매번 모든 변수의 타입을 일일이 손으로 적어야 하는 번거로움에서 벗어날 수 있다. 힌들리-밀너 타입 시스템이 이런 타입 추론의 대표적인 이론적 기반이다.
왜 중요한가
정적 타입 시스템은 프로그램이 실행되기 전에 많은 오류를 잡아낼 수 있다는 장점이 있지만, 모든 타입을 손으로 적어야 한다면 코드가 장황해지고 생산성이 떨어집니다. 타입 추론은 이 두 가지 요구를 동시에 만족시키는 방법이기 때문에, 프로그래밍 언어 설계와 컴파일러 연구에서 핵심적으로 다뤄지는 주제이며, 최신 언어(러스트, 스위프트, 코틀린 등)의 설계 논의에서도 빠지지 않고 등장합니다.
논문에서는 이렇게 쓰입니다
명시적 타입 선언 없이도 정적 타입 검사의 이점을 얻는 언어 기능을 설명할 때 사용된다.
모든 상황에서 완벽하게 타입을 추론하는 것이 이론적으로 불가능하거나 매우 비효율적일 수 있어, 일부 지점에서만 추론을 수행하는 절충된 방식을 제안했다는 뜻입니다.
조금 더 깊게 보면
고전적인 타입 추론 알고리즘인 알고리즘 W(Algorithm W)는 프로그램 안의 각 표현식에 타입 변수를 부여하고, 이들 사이의 제약을 모으는 단일화(unification) 과정을 통해 가능한 가장 일반적인 타입을 찾아냅니다. 하지만 서브타이핑, 오버로딩, 고차 다형성처럼 표현력이 강한 타입 시스템을 도입하면 완전 자동 추론이 이론적으로 어려워지거나 불가능해질 수 있어, 실제 언어들은 일부 지점에서만 타입 표기를 요구하는 지역적 타입 추론이나 양방향 타입 검사(bidirectional type checking) 같은 절충된 접근을 사용하는 경우가 많습니다.
주의할 점
타입 추론이 강력한 언어일수록 오류가 발생했을 때 컴파일러가 보고하는 오류 메시지가 실제 문제 지점과 멀리 떨어진 곳을 가리켜 원인을 파악하기 어려운 경우가 있다.