Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

팬텀 타입 파라미터

팬텀 타입 파라미터(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);
}

참고:

Derive, 구조체, 그리고 튜플.