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

제네릭

_제네릭(Generics)_은 타입과 기능을 더 넓은 케이스로 일반화하는 주제입니다. 이는 여러 면에서 코드 중복을 줄이는 데 매우 유용하지만, 다소 복잡한 문법을 요구할 수 있습니다. 즉, 제네릭이 되려면 제네릭 타입이 실제로 유효한 것으로 간주되는 타입을 지정하는 데 세심한 주의가 필요합니다. 제네릭의 가장 간단하고 흔한 용도는 타입 파라미터입니다.

타입 파라미터는 꺾쇠 괄호와 대문자 카멜 케이스를 사용하여 제네릭으로 지정됩니다: <Aaa, Bbb, ...>. “제네릭 타입 파라미터“는 일반적으로 <T>로 표현됩니다. Rust에서 “제네릭“은 하나 이상의 제네릭 타입 파라미터 <T>를 허용하는 모든 것을 설명하기도 합니다. 제네릭 타입 파라미터로 지정된 모든 타입은 제네릭이며, 그 외의 모든 것은 구체적(비-제네릭)입니다.

예를 들어, 모든 타입의 인자 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`를 사용합니다.
}

참고:

구조체