타입 추론 (type inference)

컴퓨터과학·AI
한 줄 정의: 프로그래머가 변수나 함수의 타입을 명시적으로 선언하지 않아도, 컴파일러가 코드의 사용 맥락으로부터 각 표현식의 타입을 자동으로 알아내는 기법.
타입 추론타입 추론 단계 순서: 타입 변수 부여 → 제약 수집, 제약 수집 → 단일화, 단일화 → 가장 일반적인 타입.타입 변수 부여표현식마다제약 수집타입 변수 사이 관계단일화unification가장 일반적인 타입선언 없이 확정1234알고리즘 W(힌들리-밀너 타입 시스템)의 흐름한계서브타이핑·오버로딩·고차 다형성이 있으면 완전 자동 추론이 어려워,지역적 타입 추론·양방향 타입 검사로 절충한다타입 추론타입 추론 단계 순서: 타입 변수 부여 → 제약 수집, 제약 수집 → 단일화, 단일화 → 가장 일반적인 타입.타입 변수 부여표현식마다제약 수집타입 변수 사이 관계단일화unification가장 일반적인 타입선언 없이 확정1234알고리즘 W(힌들리-밀너 타입 시스템)의 흐름한계서브타이핑·오버로딩·고차 다형성이 있으면완전 자동 추론이 어려워, 지역적 타입 추론·양방향 타입 검사로 절충한다

쉽게 풀면

타입 추론은 컴파일러가 마치 탐정처럼 코드 안의 단서들을 종합해 각 변수와 표현식의 타입을 스스로 알아내는 기능이다. 예를 들어 'x = 3 + 5'라고만 써도, 3과 5가 정수이고 더하기 연산의 결과도 정수이므로 x 역시 정수 타입이라는 것을 컴파일러가 자동으로 추론해준다. 이 덕분에 프로그래머는 정적 타이핑의 안전성(오류를 미리 잡아내는 이점)을 누리면서도, 매번 모든 변수의 타입을 일일이 손으로 적어야 하는 번거로움에서 벗어날 수 있다. 힌들리-밀너 타입 시스템이 이런 타입 추론의 대표적인 이론적 기반이다.

왜 중요한가

정적 타입 시스템은 프로그램이 실행되기 전에 많은 오류를 잡아낼 수 있다는 장점이 있지만, 모든 타입을 손으로 적어야 한다면 코드가 장황해지고 생산성이 떨어집니다. 타입 추론은 이 두 가지 요구를 동시에 만족시키는 방법이기 때문에, 프로그래밍 언어 설계와 컴파일러 연구에서 핵심적으로 다뤄지는 주제이며, 최신 언어(러스트, 스위프트, 코틀린 등)의 설계 논의에서도 빠지지 않고 등장합니다.

논문에서는 이렇게 쓰입니다

"본 언어는 힌들리-밀너 알고리즘 기반의 타입 추론을 지원하여, 명시적 타입 선언 없이도 완전한 정적 타입 안전성을 제공한다."

명시적 타입 선언 없이도 정적 타입 검사의 이점을 얻는 언어 기능을 설명할 때 사용된다.

"제네릭과 서브타이핑이 함께 존재하는 언어에서는 완전한 타입 추론이 결정 불가능해질 수 있어, 본 연구에서는 지역적 타입 추론(local type inference) 기법을 적용해 실용적인 절충안을 제시하였다."

모든 상황에서 완벽하게 타입을 추론하는 것이 이론적으로 불가능하거나 매우 비효율적일 수 있어, 일부 지점에서만 추론을 수행하는 절충된 방식을 제안했다는 뜻입니다.

조금 더 깊게 보면

고전적인 타입 추론 알고리즘인 알고리즘 W(Algorithm W)는 프로그램 안의 각 표현식에 타입 변수를 부여하고, 이들 사이의 제약을 모은 뒤 단일화(unification)로 풀어 가능한 가장 일반적인 타입을 찾아냅니다. 하지만 서브타이핑, 오버로딩, 고차 다형성처럼 표현력이 강한 타입 시스템을 도입하면 완전 자동 추론이 이론적으로 어려워지거나 불가능해질 수 있어, 실제 언어들은 일부 지점에서만 타입 표기를 요구하는 지역적 타입 추론이나 양방향 타입 검사(bidirectional type checking) 같은 절충된 접근을 사용하는 경우가 많습니다.

주의할 점

타입 추론이 강력한 언어일수록 오류가 발생했을 때 컴파일러가 보고하는 오류 메시지가 실제 문제 지점과 멀리 떨어진 곳을 가리켜 원인을 파악하기 어려운 경우가 있다.

관련 용어