제네릭으로 중복을 타입화하기

제네릭은 여러 타입에서 같은 구조나 알고리즘을 공유하되, 구체 타입의 안전성은 컴파일러가 유지하게 합니다.

추출 기준 함수 본문이 타입만 다르고 로직이 같다면 타입 매개변수 T를 도입해 중복을 제거할 수 있습니다.

Rust는 단형성화를 통해 제네릭 코드를 구체 타입별 코드로 바꾸므로 일반적으로 런타임 비용이 추가되지 않습니다.

타입만 다른 중복
largest_i32(&[i32])largest_char(&[char])
공통 로직 추출
한 제네릭 정의largest<T: PartialOrd>(&[T])타입 관계와 필요한 동작만 남김
컴파일
타입별 단형성화
largest::<i32>largest::<char>
함수 제네릭

fn largest<T>처럼 매개변수 타입을 나중에 정하게 합니다.

구조체 제네릭

Point<T>처럼 필드 타입을 재사용 가능한 형태로 둡니다.

enum 제네릭

Option<T>, Result<T, E>처럼 값의 모양과 실패 타입을 분리합니다.

메서드 제네릭

impl<T> 블록으로 제네릭 타입에 동작을 붙입니다.

제네릭 도입 순서

성능 감각
1
비교

중복 함수나 타입에서 달라지는 부분을 표시합니다.

2
매개화

달라지는 타입을 T, E 같은 매개변수로 올립니다.

3
제약

필요한 연산이 있으면 다음 절의 트레이트 바운드로 제한합니다.

제네릭은 아무 타입이나 받는다는 뜻이 아니라, 같은 패턴을 타입 안정성을 잃지 않고 재사용한다는 뜻입니다.