Rust 제네릭 기능 탐색

Beginner

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

소개

이 실습에서는 일반화된 타입과 기능을 다루어 코드 중복을 줄이는 제네릭 (generics) 에 대해 알아볼 것입니다. Rust 에서 제네릭을 사용하는 구문은 <T>와 같이 꺾쇠 괄호를 사용하여 타입 매개변수를 지정합니다. 제네릭을 사용하면 어떤 타입의 인수도 받을 수 있는 제네릭 함수를 만들 수 있습니다. 또한, 다양한 구체적인 타입과 함께 작동할 수 있는 제네릭 타입을 정의할 수 있습니다.

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

제네릭

*제네릭 (Generics)*은 타입과 기능을 더 광범위한 경우에 일반화하는 개념입니다. 이는 코드 중복을 다양한 방식으로 줄이는 데 매우 유용하지만, 상당히 복잡한 구문을 요구할 수 있습니다. 즉, 제네릭 타입이 실제로 유효한 타입에 대해 명시하는 데 신중해야 합니다. 제네릭의 가장 간단하고 일반적인 사용법은 타입 매개변수입니다.

타입 매개변수는 꺾쇠 괄호를 사용하여 제네릭으로 지정되며, 일반적으로 <T>로 표시됩니다. Rust 에서 "제네릭"은 하나 이상의 제네릭 타입 매개변수 <T>를 받는 모든 것을 의미합니다. 제네릭 타입 매개변수로 지정된 모든 타입은 제네릭이고, 그 외의 모든 타입은 구체적 (non-generic) 입니다.

예를 들어, 모든 타입의 인수 T를 받는 foo라는 제네릭 함수를 정의하는 방법은 다음과 같습니다.

fn foo<T>(arg: T) { ... }

<T>를 사용하여 T를 제네릭 타입 매개변수로 지정했기 때문에 여기서 (arg: T)로 사용될 때 제네릭으로 간주됩니다. 이는 T가 이전에 struct로 정의되었더라도 마찬가지입니다.

이 예제는 구문을 보여줍니다.

// 구체적인 타입 `A`.
struct A;

// `Single` 타입을 정의할 때, 첫 번째 `A` 사용은 `<A>` 가 앞에 없습니다.
// 따라서 `Single` 은 구체적인 타입이고, `A` 는 위와 같이 정의됩니다.
struct Single(A);
//            ^ 여기에 `Single` 의 첫 번째 `A` 타입 사용이 있습니다.

// 여기서 `<T>` 가 `T` 의 첫 번째 사용 앞에 있으므로 `SingleGen` 은 제네릭 타입입니다.
// 타입 매개변수 `T` 가 제네릭이므로, 맨 위에 정의된 구체적인 타입 `A` 를 포함하여 무엇이든 될 수 있습니다.
struct SingleGen<T>(T);

fn main() {
    // `Single` 은 구체적이며 명시적으로 `A` 를 사용합니다.
    let _s = Single(A);

    // `SingleGen<char>` 타입의 변수 `_char` 를 생성하고 `SingleGen('a')` 값을 할당합니다.
    // 여기서 `SingleGen` 은 명시적으로 타입 매개변수를 지정합니다.
    let _char: SingleGen<char> = SingleGen('a');

    // `SingleGen` 은 암시적으로 타입 매개변수를 지정할 수도 있습니다.
    let _t    = SingleGen(A); // 맨 위에 정의된 `A` 를 사용합니다.
    let _i32  = SingleGen(6); // `i32` 를 사용합니다.
    let _char = SingleGen('a'); // `char` 를 사용합니다.
}

요약

축하합니다! 제네릭 실습을 완료했습니다. LabEx 에서 더 많은 실습을 통해 기술을 향상시킬 수 있습니다.