Display 트레이트
Coddy Rust 여정의 Object Oriented Programming 섹션에 포함된 레슨 — 61개 중 36번째.
Debug는 데이터를 검사하는 개발자에게는 훌륭하지만, Display 트레이트는 사용자용 출력을 위해 설계되었습니다. 이것은 println!의 {} 포맷터를 구동하는 요소입니다. Debug와 달리, Rust는 Display를 자동으로 파생(derive)할 수 없으므로 수동으로 구현해야 합니다.
Display를 구현하려면, fmt 모듈을 가져오고 fmt 메서드를 구현해야 합니다:
use std::fmt;
struct Temperature {
celsius: f64,
}
impl fmt::Display for Temperature {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "{}°C", self.celsius)
}
}
fmt 메서드는 Formatter를 받고 fmt::Result를 반환합니다. write! 매크로를 사용하여 출력을 포맷하며, self를 통해 구조체의 필드에 접근합니다.
이제 표준 {} 포맷터를 사용하여 구조체를 출력할 수 있습니다:
let temp = Temperature { celsius: 23.5 };
println!("{}", temp); // 23.5°C
주요 차이점: Debug 출력은 데이터의 구조를 보여주며(디버깅에 유용함), Display 출력은 다듬어져 있으며 최종 사용자를 위한 것입니다. 구조체는 두 가지를 모두 구현할 수 있습니다. 디버깅에는 {:?}를 사용하고 깔끔한 출력에는 {}를 사용하세요.
챌린지
쉬움사용자 친화적인 제품 표시 시스템을 만들어 봅시다! Debug가 데이터의 원시 구조를 보여주는 반면, Display 트레이트는 최종 사용자에게 적합한 세련되고 읽기 쉬운 출력을 만들 수 있게 해줍니다.
코드는 두 개의 파일로 구성됩니다:
product.rs: 두 개의 공개 필드name(String)과price(f64)를 가진 공개Product구조체를 정의하세요. 구조체에 대해Display트레이트를 구현하여{name} - ${price}형식으로 포맷되도록 하세요.std::fmt를 가져오고fmt메서드 내부에서write!매크로를 사용하는 것을 잊지 마세요.main.rs: product 모듈을 가져오고 제공된 입력을 사용하여Product인스턴스를 생성하세요. 표준{}포맷터를 사용하여 제품을 출력하고 사용자 정의된 표시 출력을 확인하세요.
Display 트레이트는 fmt 메서드를 수동으로 구현해야 합니다. Rust는 Debug처럼 이를 자동으로 파생(derive)할 수 없습니다. 이를 통해 타입이 사용자에게 어떻게 보여질지 완벽하게 제어할 수 있습니다.
출력은 다음과 같이 깔끔하고 사용자 친화적인 형식으로 제품을 표시해야 합니다:
{name} - ${price}예를 들어, 입력값이 Wireless Mouse와 29.99인 경우:
Wireless Mouse - $29.99제품 이름과 가격(f64로 파싱) 두 개의 입력을 받게 됩니다.
치트 시트
Display 트레이트는 사용자용 출력을 위해 설계되었으며, println!의 {} 포매터를 구동합니다. Debug와 달리, 이 트레이트는 반드시 수동으로 구현해야 합니다.
Display를 구현하려면 fmt 모듈을 가져와서 fmt 메서드를 구현하세요:
use std::fmt;
struct Temperature {
celsius: f64,
}
impl fmt::Display for Temperature {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "{}°C", self.celsius)
}
}
fmt 메서드는 Formatter를 전달받고 fmt::Result를 반환합니다. write! 매크로를 사용하여 출력을 포맷팅하고, self를 통해 구조체 필드에 접근합니다.
{} 포매터를 사용하여 구조체를 출력합니다:
let temp = Temperature { celsius: 23.5 };
println!("{}", temp); // 23.5°C
주요 차이점: Debug ({:?})는 디버깅을 위해 데이터 구조를 보여주는 반면, Display ({})는 최종 사용자를 위한 다듬어진 출력을 제공합니다.
직접 해보기
mod product;
use product::Product;
fn main() {
let mut name = String::new();
std::io::stdin().read_line(&mut name).expect("Failed to read line");
let name = 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: name과 price를 사용하여 Product 인스턴스를 생성하세요
// TODO: {} 포맷터를 사용하여 product를 출력하세요
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.