comnic's Dev&Life

[Rust] 10. 제네릭(Generic Data Types) 프로그래밍 본문

Rust

[Rust] 10. 제네릭(Generic Data Types) 프로그래밍

comnic 2023. 12. 9. 16:49
반응형

10. 제네릭 프로그래밍

제네릭 데이터 타입은 Rust에서 타입의 일반성을 높이기 위해 사용되는 기능으로, 코드를 추상화하고 재사용성을 높이는 데에 기여합니다. 제네릭은 함수나 구조체 등에서 사용할 수 있으며, 특정 타입을 고정하지 않고 여러 다양한 타입에서 동작하도록 설계됩니다.

10.1 제네릭 함수와 구조체:

일반적인 함수와 함수 호출에 대한 예제를 먼저 살펴보겠습니다.

fn print_number(value: i32) {
    println!("Value: {}", value);
}

fn print_string(value: &str) {
    println!("Value: {}", value);
}

fn main() {
    print_number(42);
    print_string("Hello");
    // print_number("World"); // 에러: 타입 불일치
}

i32와 string을 출력하는 각각의 함수를 구현하고, main()에서 각각을 호출하여 사용하였습니다. 물론 파라미터의 타입이 다르면 에러가 발생합니다. 2개의 함수가 정확히 같은 일을 함에도 따로 구현해야 했습니다. 이를 제네릭 함수로 구현하면 아래와 같습니다.

제네릭 함수

// 제네릭 함수
fn print_info<T>(value: T) {
    println!("Value: {:?}", value);
}

fn main() {
    print_info(42);        // 숫자 타입에 대해 동작
    print_info("Hello");   // 문자열에 대해 동작
    print_info(vec![1, 2, 3]); // 벡터에 대해 동작
}
  • print_info 함수는 <T>를 통해 제네릭으로 정의되어 있습니다. 이 함수는 어떤 타입(T)이든 받아들일 수 있습니다.
  • main 함수에서는 숫자, 문자열, 벡터 등 다양한 타입으로 print_info를 호출할 수 있습니다.

제네릭 구조체

// 제네릭 구조체
struct Pair<T, U> {
    first: T,
    second: U,
}

fn main() {
    let pair1 = Pair { first: 42, second: "hello" };
    let pair2 = Pair { first: 3.14, second: true };

    println!("Pair 1: {:?} and {:?}", pair1.first, pair1.second);
    println!("Pair 2: {:?} and {:?}", pair2.first, pair2.second);
}
  • Pair 구조체는 <T, U>를 통해 두 개의 제네릭 타입을 가지는 구조체입니다.
  • main 함수에서는 각각 숫자와 문자열, 실수와 불리언을 가지는 Pair 구조체를 생성하고 출력합니다.

 

10.2 트레이트(Trait)와 제네릭 제약

제네릭에서는 특정한 트레이트를 구현한 타입에 대한 제약을 둘 수 있습니다. 이를 통해 특정한 동작이 가능한 타입에만 제네릭을 적용할 수 있도록 할 수 있습니다.

제네릭 제약

// Display 트레이트를 구현한 타입에 대한 제네릭 함수
fn display<T: std::fmt::Display>(value: T) {
    println!("Display: {}", value);
}

fn main() {
    display(42);        // 숫자 타입은 Display 트레이트를 구현하므로 동작
    display("hello");   // 문자열 타입도 Display 트레이트를 구현하므로 동작
    // display(vec![1, 2, 3]); // 벡터 타입은 Display를 구현하지 않았으므로 컴파일 에러
}
  • display 함수는 T가 std::fmt::Display 트레이트를 구현한 타입에 대해 동작하도록 제한됩니다.
  • main 함수에서는 숫자와 문자열은 Display 트레이트를 구현하므로 정상적으로 동작하지만, 벡터는 해당 트레이트를 구현하지 않았으므로 컴파일 에러가 발생합니다.

제네릭 프로그래밍을 통해 코드를 보다 일반적이고 추상적으로 작성할 수 있으며, 트레이트와 함께 사용하여 특정 동작을 요구하는 제네릭 코드를 작성할 수 있습니다.

반응형
Comments