파이썬 타입 매개변수

Beginner

This tutorial is from open-source community. Access the source code

소개

이 실습에서는 컴파일 시점에 정적으로 검사되지만 런타임 동작이나 값을 갖지 않는 파이썬 타입 매개변수 (phantom type parameters) 개념을 탐구합니다. Rust 에서 std::marker::PhantomData를 파이썬 타입 매개변수 개념과 결합하여 서로 다른 데이터 유형을 포함하는 튜플과 구조체를 만드는 방법을 보여줍니다.

참고: 실습에서 파일 이름을 지정하지 않으면 원하는 파일 이름을 사용할 수 있습니다. 예를 들어 main.rs를 사용하고 rustc main.rs && ./main으로 컴파일 및 실행할 수 있습니다.

파이썬 타입 매개변수

파이썬 타입 매개변수는 런타임에는 나타나지 않지만 컴파일 시점에만 정적으로 검사되는 매개변수입니다.

데이터 유형은 추가적인 제네릭 타입 매개변수를 사용하여 컴파일 시점에 마커 역할을 하거나 타입 검사를 수행할 수 있습니다. 이러한 추가 매개변수는 저장 값을 가지지 않으며 런타임 동작이 없습니다.

다음 예제에서는 std::marker::PhantomData를 파이썬 타입 매개변수 개념과 결합하여 서로 다른 데이터 유형을 포함하는 튜플을 만듭니다.

use std::marker::PhantomData;

// `A` 에 대한 제네릭이고 숨겨진 매개변수 `B` 를 가진 파이썬 튜플 구조체.
#[derive(PartialEq)] // 이 유형에 대한 동등성 테스트를 허용합니다.
struct PhantomTuple<A, B>(A, PhantomData<B>);

// `A` 에 대한 제네릭이고 숨겨진 매개변수 `B` 를 가진 파이썬 타입 구조체.
#[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);
}

요약

축하합니다! 파이썬 타입 매개변수 실습을 완료했습니다. LabEx 에서 더 많은 실습을 통해 기술을 향상시킬 수 있습니다.