[Rust 공식문서 한국어 정리] 64. Rust 타입 추론 가이드
[Rust 공식문서 한국어 정리] 64. Rust 타입 추론 가이드
원문 제목: Type Inference — The Rust Reference
작성자: Rust Language Team
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
📌 1. 서론 — 이 문서가 다루는 내용
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
이 문서는 Rust 컴파일러가 명시적인 타입 어노테이션 없이도 변수와 표현식의 타입을 결정하는 타입 추론 메커니즘을 설명합니다.
Hindley-Milner 기반의 제약 기반 추론, let 문장, 클로저, 제네릭 함수 호출에서의 타입 결정 과정을 다룹니다.
타입 추론의 한계, 모호성 에러, 그리고 명시적 어노테이션이 필요한 상황을 중심으로 설명합니다.
개발자가 타입 추론을 신뢰하면서도, 디버깅과 API 설계 시 명시적 타입의 필요성을 이해하는 것이 목표입니다.
Rust의 강력한 타입 시스템을 효과적으로 활용하려는 모든 개발자에게 기본이 되는 내용입니다.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
🔑 2. 핵심 개념 4가지
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
① Type Annotation: 컴파일러에게 타입을 명시적으로 알려주는 구문으로, let x: u32 = 5; 형태입니다.
② Constraint-based Inference: 표현식 간의 관계를 제약으로 모델링하여 타입을 결정하는 방식입니다.
③ Turbofish (::<>): 제네릭 함수 호출 시 컴파일러가 타입을 추론하지 못할 때 명시적으로 지정하는 문법입니다.
④ Ambiguity Error: 추론할 수 있는 정보가 부족하여 컴파일러가 타입을 결정하지 못할 때 발생하는 에러입니다.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
📖 3. 주요 내용 상세
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Rust의 타입 추론은 Hindley-Milner 알고리즘을 확장한 제약 기반 방식으로 동작합니다.
컴파일러는 프로그램 전체의 타입 관계를 제약 집합으로 수집하고, 이를 만족하는 가장 일반적인 타입을 찾습니다.
let x = 5;에서 x는 i32로 추론되며, 이는 정수 리터럴의 기본 타입입니다.
클로저의 인자 타입은 첫 번째 호출 시 결정됩니다.
let f = |x| x + 1;에서 f가 i32에 대해 호출되면, x는 i32로 고정됩니다.
이후 다른 타입에 대해 호출하면 컴파일 에러가 발생하므로, 범용 클로저가 필요하면 제네릭 함수를 사용해야 합니다.
제네릭 함수 호출에서는 대부분의 경우 타입이 추론됩니다.
let v: Vec<_> = vec.iter().map(|x| x * 2).collect();에서 collect의 반환 타입은 Vec<_> 어노테이션으로 결정됩니다.
어노테이션이 없으면 collect()는 어떤 컬렉션을 반환해야 할지 모르므로 컴파일 에러가 발생합니다.
Turbofish 문법 ::<>은 추론 모호성을 해결합니다.
let x = "hello".parse::().unwrap();에서 parse의 반환 타입을 명시적으로 지정합니다.
메서드 체이닝 중에도 turbofish를 사용하여 중간 단계의 타입을 명시할 수 있습니다.
타입 추론의 한계는 복잡한 제네릭 관계와 연관 타입에서 나타납니다.
높은 순위 트레이트 바운드(HRTB)나 복잡한 클로저 반환 타입에서는 컴파일러가 타입을 결정하지 못할 수 있습니다.
이 경우 명시적 타입 어노테이션이나 타입 별칭(type alias)을 사용하여 복잡도를 줄입니다.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
🛠 4. 실전 활용
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
간단한 변수는 타입을 생략하고 추론에 맡기되, 복잡한 표현식에는 명시적 어노테이션을 추가합니다.
API 공개 함수의 반환 타입은 항상 명시하여, 호출자의 추론을 돕습니다.
collect()나 parse()처럼 반환 타입이 모호한 함수에서는 turbofish나 명시적 변수 타입을 사용합니다.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
✅ 5. 정리
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Rust의 타입 추론은 강력하면서도 예측 가능합니다.
대부분의 경우 명시적 어노테이션 없이도 안전하게 작동하지만, 모호성은 적절한 명시로 해결합니다.
타입 어노테이션은 문서화의 역할도 하므로, 공개 API에서는 생략하지 마세요.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
🔗 출처 링크
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
원문: https://doc.rust-lang.org/reference/type-inference.html
Rust Book Type Inference: https://doc.rust-lang.org/book/ch03-02-data-types.html
#Rust #TypeInference #Generics #Turbofish #TypeSystem #Compiler #번역

오뉴노노 님의 최근 댓글
ㅋㅋㅋㅋㅋ 2019 01.14 잘 읽었습니다 2018 12.30 포인트가 없어서 아직 시작을 못하고있는데요! 글은 잘 읽었습니다! 포인트 쌓고 도전할거에요 2018 12.30