[rust] 제네릭 타입 가변성

Rust에서 제네릭 타입 가변성은 함수나 구조체 내에서 제네릭 타입의 가변성을 제어하는 기능을 말합니다. 제네릭 타입 가변성을 잘 이해하고 활용한다면 코드의 유연성과 안정성을 높일 수 있습니다.

제네릭 타입 가변성의 세 가지 종류

Rust에서는 제네릭 타입에 대해 세 가지의 가변성을 제어할 수 있습니다.

  1. 불변성(Immutable): T
  2. 가변성(Mutable): &mut T
  3. 공변성(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의 제네릭 타입 가변성을 이해하고 적절히 활용함으로써 안정적이고 유연한 코드를 작성할 수 있습니다. 다양한 가변성과 타입 가변성 기법을 익히고 응용하여 러스트의 강력한 타입 시스템을 최대한 활용해보세요.

더 자세한 정보는 런스트 공식 문서를 참고하세요.