Rust의 제네릭 이해: 완벽 정복
Mar 29, 2025
# Rust
Wenhao Wang
Dev Intern · Leapcell

프로그래밍에서 흔히 요구되는 사항은 동일한 함수를 사용하여 여러 유형의 데이터를 처리하는 것입니다. 제네릭을 지원하지 않는 프로그래밍 언어에서는 일반적으로 각 데이터 유형에 대해 별도의 함수를 작성해야 합니다. 제네릭의 존재는 개발자에게 편의성을 제공하고 코드 중복을 줄이며 언어의 표현 능력을 크게 풍부하게 합니다. 이를 통해 동일한 작업을 수행하지만 다른 유형의 데이터에서 작동하는 많은 함수를 단일 함수로 대체할 수 있습니다.
예를 들어, 제네릭을 사용하지 않는 경우 매개변수가 u8
, i8
, u16
, i16
, u32
, i32
등 유형일 수 있는 double
함수를 정의하는 것은 다음과 같습니다.
fn double_u8(i: u8) -> u8 { i + i } fn double_i8(i: i8) -> i8 { i + i } fn double_u16(i: u16) -> u16 { i + i } fn double_i16(i: i16) -> i16 { i + i } fn double_u32(i: u32) -> u32 { i + i } fn double_i32(i: i32) -> i32 { i + i } fn double_u64(i: u64) -> u64 { i + i } fn double_i64(i: i64) -> i64 { i + i } fn main(){ println!("{}", double_u8(3_u8)); println!("{}", double_i16(3_i16)); }
위의 double
함수는 논리가 동일하며 데이터 유형만 다릅니다.
제네릭을 사용하여 유형 차이로 인한 코드 중복 문제를 해결할 수 있습니다. 제네릭을 사용하는 경우:
use std::ops::Add; fn double<T>(i: T) -> T where T: Add<Output=T> + Clone + Copy { i + i } fn main(){ println!("{}", double(3_i16)); println!("{}", double(3_i32)); }
위의 문자 T
는 제네릭이며 (x
와 같은 변수의 의미와 유사) 가능한 다양한 데이터 유형을 나타내는 데 사용됩니다.
함수 정의에서 제네릭 사용
제네릭으로 함수를 정의할 때 함수 서명에서 매개변수 및 반환 유형을 명시적으로 지정하는 대신 제네릭을 사용하여 코드를 보다 적용 가능하게 만듭니다. 이렇게 하면 함수 호출자에게 더 많은 유연성을 제공하고 코드 중복을 방지할 수 있습니다.
Rust에서 제네릭 매개변수 이름은 임의적일 수 있지만 규칙에 따라 T
(