팬텀 타입 파라미터
팬텀 타입 파라미터(phantom type parameter)는 런타임에는 나타나지 않지만, 컴파일 타임에만 정적으로 검사되는 파라미터입니다.
데이터 타입은 추가적인 제네릭 타입 파라미터를 사용하여 마커 역할을 하거나 컴파일 타임에 타입 검사를 수행할 수 있습니다. 이러한 추가 파라미터는 저장 값을 가지지 않으며, 런타임 동작도 없습니다.
다음 예제에서는 std::marker::PhantomData와 팬텀 타입 파라미터 개념을 결합하여 서로 다른 데이터 타입을 포함하는 튜플을 생성합니다.
use std::marker::PhantomData;
// 숨겨진 파라미터 `B`를 가지며 `A`에 대해 제네릭인 팬텀 튜플 구조체.
#[derive(PartialEq)] // 이 타입에 대한 동등성 테스트를 허용합니다.
struct PhantomTuple<A, B>(A, PhantomData<B>);
// 숨겨진 파라미터 `B`를 가지며 `A`에 대해 제네릭인 팬텀 타입 구조체.
#[derive(PartialEq)] // 이 타입에 대한 동등성 테스트를 허용합니다.
struct PhantomStruct<A, B> { first: A, phantom: PhantomData<B> }
// 주의: 제네릭 타입 `A`에는 저장 공간이 할당되지만, `B`에는 할당되지 않습니다.
// 따라서 `B`는 연산에 사용될 수 없습니다.
fn main() {
// 여기서 `f32`와 `f64`는 숨겨진 파라미터입니다.
// PhantomTuple 타입이 `<char, f32>`로 지정되었습니다.
let _tuple1: PhantomTuple<char, f32> = PhantomTuple('Q', PhantomData);
// PhantomTuple 타입이 `<char, f64>`로 지정되었습니다.
let _tuple2: PhantomTuple<char, f64> = PhantomTuple('Q', PhantomData);
// 타입이 `<char, f32>`로 지정되었습니다.
let _struct1: PhantomStruct<char, f32> = PhantomStruct {
first: 'Q',
phantom: PhantomData,
};
// 타입이 `<char, f64>`로 지정되었습니다.
let _struct2: PhantomStruct<char, f64> = PhantomStruct {
first: 'Q',
phantom: PhantomData,
};
// 컴파일 타임 에러! 타입 불일치로 인해 비교할 수 없습니다:
// println!("_tuple1 == _tuple2 yields: {}",
// _tuple1 == _tuple2);
// 컴파일 타임 에러! 타입 불일치로 인해 비교할 수 없습니다:
// println!("_struct1 == _struct2 yields: {}",
// _struct1 == _struct2);
}