Types 트랙에서 제네릭 struct 를 만났어. 제네릭 함수 는 같은 아이디어를 동작에 적용한 거야: 로직을 한 번 쓰고, 맞는 모든 타입에 돌려.
함수의 타입 파라미터
fn first<T>(list: &[T]) -> &T 는 아무 타입 T 의 슬라이스에 통해. 이름 뒤의 <T> 가 타입 파라미터를 도입해, lifetime 이나 제네릭 struct 랑 정확히 똑같이. 각 호출에서 컴파일러가 인자로부터 T 가 뭔지 알아내 — 명시적으로 쓸 일은 드물어.
또 monomorphization
제네릭은 런타임 비용이 없어. 컴파일러가 네가 실제로 부르는 각 구체 타입마다 특화 복사본을 생성해 — i32 용 하나, &str 용 하나, 각각 손으로 쓴 것만큼 빨라. 제네릭의 재사용성을 특화 함수의 속도로, 런타임 디스패치 없이 얻어.
제네릭 코드는 컴파일러가 채우는 템플릿 코드야. 네가 쓰는 각 구별되는 타입이 자기 기계어를 찍어내. 그게 Rust 제네릭이 'zero-cost' 인 이유야 — 추상화는 컴파일 타임에만 존재하고; 실행 바이너리엔 구체적이고 특화된 함수들이 들어 있어.
trait 이 필요한 함정
맨 T 는 거의 쓸모없어 — move 는 되는데 비교, 더하기, 출력은 못 해, 모든 타입이 그 연산을 지원하진 않으니까. '이 T 는 비교 가능해' 라고 말하려면 trait bound 로 제약해 — 바로 다음 레슨. 제네릭은 파라미터를 주고; trait 은 거기에 능력을 줘.