Menu
Coddy logo textTech

요약 - 제네릭 프린터

Coddy Rust 여정의 Object Oriented Programming 섹션에 포함된 레슨 — 61개 중 44번째.

challenge icon

챌린지

쉬움

트레이트 바운드(trait bounds)의 강력함을 보여주는 유연한 공지 시스템을 만들어 봅시다! Printable 트레이트와 이 트레이트를 구현하는 모든 타입을 공지할 수 있는 제네릭 함수를 생성하게 됩니다. 이를 통해 제네릭과 트레이트가 어떻게 결합하여 재사용 가능하고 타입 안전한 코드를 만드는지 배우게 될 것입니다.

코드는 두 개의 파일로 구성됩니다:

  • printable.rs: &self를 매개변수로 받고 String을 반환하는 print_info 메서드를 가진 공개(public) Printable 트레이트를 정의하세요. 그런 다음 Printable을 구현하는 모든 타입 T를 허용하는 announce라는 공개 제네릭 함수를 만드세요. 이 함수는 Announcement: {info}를 출력해야 하며, 여기서 {info}는 해당 아이템의 print_info()를 호출한 결과입니다.
  • main.rs: Printable을 구현하는 두 개의 공개 구조체를 만드세요:
    • Person — 공개 name 필드(String)를 가집니다. print_infoPerson: {name}을 반환해야 합니다.
    • Product — 공개 name(String) 필드와 price(f64) 필드를 가집니다. print_infoProduct: {name} - ${price}를 반환해야 합니다.
    작성한 printable 모듈을 가져오고, 입력을 사용하여 Person과 Product를 생성한 다음, 각각에 대해 announce를 호출하여 제네릭 함수가 모든 Printable 타입과 잘 작동함을 증명하세요.

이 설계의 장점은 announce 함수가 Person을 받는지, Product를 받는지, 혹은 미래에 추가될 다른 타입을 받는지 상관하지 않는다는 점입니다. 오직 해당 타입이 print_info()를 통해 정보를 제공할 수 있다는 것만 요구합니다. 트레이트 바운드는 컴파일 타임에 이를 보장합니다.

출력 결과는 두 공지 사항을 모두 보여주어야 합니다:

Announcement: Person: {name}
Announcement: Product: {product_name} - ${price}

예를 들어, 입력값이 Alice, Laptop, 999.99인 경우:

Announcement: Person: Alice
Announcement: Product: Laptop - $999.99

세 가지 입력을 받게 됩니다: 사람의 이름, 제품 이름, 그리고 제품 가격(f64로 파싱).

직접 해보기

mod printable;

use printable::{Printable, announce};

// TODO: 공개 name 필드(String)를 가진 공개 구조체 Person을 정의하세요
// Person에 대해 Printable 트레이트를 구현하세요
// print_info는 "Person: {name}"을 반환해야 합니다

// TODO: 공개 name(String) 및 price(f64) 필드를 가진 공개 구조체 Product를 정의하세요
// Product에 대해 Printable 트레이트를 구현하세요
// print_info는 "Product: {name} - ${price}"를 반환해야 합니다

fn main() {
    // 입력 읽기
    let mut person_name = String::new();
    std::io::stdin().read_line(&mut person_name).expect("Failed to read line");
    let person_name = person_name.trim().to_string();

    let mut product_name = String::new();
    std::io::stdin().read_line(&mut product_name).expect("Failed to read line");
    let product_name = product_name.trim().to_string();

    let mut price_input = String::new();
    std::io::stdin().read_line(&mut price_input).expect("Failed to read line");
    let price: f64 = price_input.trim().parse().expect("Failed to parse price");

    // TODO: person_name으로 Person 인스턴스를 생성하세요

    // TODO: product_name과 price로 Product 인스턴스를 생성하세요

    // TODO: Person을 사용하여 announce를 호출하세요

    // TODO: Product를 사용하여 announce를 호출하세요
}

Object Oriented Programming의 모든 레슨