[rust] 제네릭 타입 가변성
Rust에서 제네릭 타입 가변성은 함수나 구조체 내에서 제네릭 타입의 가변성을 제어하는 기능을 말합니다. 제네릭 타입 가변성을 잘 이해하고 활용한다면 코드의 유연성과 안정성을 높일 수 있습니다.
제네릭 타입 가변성의 세 가지 종류
Rust에서는 제네릭 타입에 대해 세 가지의 가변성을 제어할 수 있습니다.
- 불변성(Immutable):
T
- 가변성(Mutable):
&mut T
- 공변성(Covariant)과 반공변성(Contravariant):
PhantomData
를 사용하여 구현
제네릭 타입의 불변성과 가변성은 불변 참조(&T
)와 가변 참조(&mut T
)로 구현할 수 있습니다. 이를 통해 러스트의 빌림 규칙(Ownership Rules)을 따르면서도 제네릭 타입을 가변하게 사용할 수 있습니다.
struct Foo<T> {
data: T,
}
impl<T> Foo<T> {
fn get_data_immutable(&self) -> &T {
&self.data
}
fn get_data_mutable(&mut self) -> &mut T {
&mut self.data
}
}
공변성과 반공변성
Rust의 제네릭 타입은 기본적으로 불변성과 가변성을 지원하며, 이외의 공변성과 반공변성은 PhantomData
타입과 트레잇 바운드를 통해 구현할 수 있습니다.
use std::marker::PhantomData;
struct Foo<'a, T> {
// ...
marker: PhantomData<&'a T>,
}
결론
Rust의 제네릭 타입 가변성을 이해하고 적절히 활용함으로써 안정적이고 유연한 코드를 작성할 수 있습니다. 다양한 가변성과 타입 가변성 기법을 익히고 응용하여 러스트의 강력한 타입 시스템을 최대한 활용해보세요.
더 자세한 정보는 런스트 공식 문서를 참고하세요.