요약 - 제네릭 프린터
Coddy Rust 여정의 Object Oriented Programming 섹션에 포함된 레슨 — 61개 중 44번째.
챌린지
쉬움트레이트 바운드(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_info는Person: {name}을 반환해야 합니다.Product— 공개name(String) 필드와price(f64) 필드를 가집니다.print_info는Product: {name} - ${price}를 반환해야 합니다.
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를 호출하세요
}