[rust] 제네릭 타입 검증

제네릭은 러스트에서 강력한 기능 중 하나로, 여러 종류의 타입을 다루는 함수나 구조체를 작성할 수 있게 해줍니다. 그러나 때로는 특정 조건을 만족하는 타입만을 허용하고 싶을 때가 있습니다.

이럴 때 러스트에서는 traitwhere 절을 사용하여 제네릭 타입을 검증할 수 있습니다.

제네릭 타입 검증하기

제네릭으로 정의된 함수나 구조체에 특정 조건을 부여하려면, 해당 조건을 나타내는 trait를 정의해야 합니다. 예를 들어, 숫자형 타입만을 받아들이는 함수를 작성하고 싶다면 trait를 이용하여 숫자형 특성을 정의할 수 있습니다.

trait Numeric {
    fn is_numeric(&self) -> bool;
}

impl Numeric for i32 {
    fn is_numeric(&self) -> bool {
        true
    }
}

fn process_numeric<T: Numeric>(value: T) {
    if value.is_numeric() {
        // 처리 로직
    } else {
        panic!("숫자형 타입이 아닙니다.");
    }
}

위 코드에서 Numeric 트레이트는 is_numeric 메서드를 가져야 하며, 해당 메서드는 true를 반환하는지를 검사하는 역할을 합니다. 그리고 process_numeric 함수에서는 <T: Numeric>를 이용하여 Numeric 트레이트를 구현한 타입에 대해서만 동작하도록 명시하였습니다.

where 절을 사용한 타입 제약

때로는 제네릭 타입을 검증하는 것이 복잡해질 수 있는데, 이때 where 절을 이용하여 타입 제약을 좀 더 명확하게 표현할 수 있습니다.

fn process_numeric<T>(value: T) 
where
    T: Numeric,
{
    if value.is_numeric() {
        // 처리 로직
    } else {
        panic!("숫자형 타입이 아닙니다.");
    }
}

where 절을 사용함으로써 함수 선언 부분을 좀 더 읽기 쉽고 명확하게 만들 수 있습니다.

결론

러스트의 제네릭 타입은 traitwhere 절을 이용하여 검증을 할 수 있어 매우 강력하고 유연한 기능을 제공합니다. 타입 검증은 안정성을 높이고 코드를 더 명확하게 만들어주므로, 실무에서 유용하게 활용될 수 있습니다.

이상으로 러스트에서의 제네릭 타입 검증에 대한 내용을 살펴보았습니다.

참고 자료: