Display 트레이트
Coddy Rust 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 61개 중 36번째.
Debug는 개발자가 데이터를 검사할 때 유용하지만, Display trait는 사용자에게 표시되는 출력을 위해 설계되었습니다. println!에서 {} formatter를 작동하게 하는 것이 바로 Display입니다. 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! macro를 사용하고, self를 통해 struct의 fields에 접근합니다.
이제 표준 {} formatter를 사용하여 struct를 출력할 수 있습니다:
let temp = Temperature { celsius: 23.5 };
println!("{}", temp); // 23.5°C
핵심적인 차이점은 다음과 같습니다. Debug 출력은 데이터의 구조를 보여 주므로 디버깅에 유용하고, Display 출력은 깔끔하게 다듬어져 최종 사용자를 위한 것입니다. 하나의 struct는 두 가지 모두를 구현할 수 있습니다. 디버깅에는 {:?}를 사용하고, 깔끔한 출력에는 {}를 사용하세요.
챌린지
쉬움사용자 친화적인 제품 표시 시스템을 만들어 봅시다! Debug가 데이터의 원시 구조를 보여 주는 반면, Display trait를 사용하면 최종 사용자를 위해 적합한 세련되고 사람이 읽기 쉬운 출력을 만들 수 있습니다.
코드를 두 파일에 나누어 구성합니다.
product.rs: 두 개의 public fields인name(String)과price(f64)를 가진 publicProductstruct를 Define합니다. struct에Displaytrait를 Implement하여{name} - ${price}형식으로 출력되도록 합니다.std::fmt를 가져오고fmtmethod 내부에서write!macro를 using하는 것을 잊지 마세요.main.rs: product module을 가져오고 제공된 입력을 사용하여Productinstance를 만듭니다. 표준{}formatter를 사용하여 product를 Print하고 사용자 지정 표시 출력을 보여 줍니다.
Display trait를 사용하려면 fmt method를 수동으로 Implement해야 합니다. Rust는 Debug처럼 이를 자동으로 derive할 수 없습니다. 따라서 type이 사용자에게 표시되는 방식을 완전히 제어할 수 있습니다.
출력에는 product가 깔끔하고 사용자 친화적인 형식으로 표시되어야 합니다.
{name} - ${price}예를 들어 입력이 Wireless Mouse와 29.99인 경우:
Wireless Mouse - $29.99두 개의 입력을 받습니다. product name과 price이며, price는 f64로 parse합니다.
직접 해보기
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 출력
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
객체 지향 프로그래밍의 모든 레슨
직접 연습해 보세요: 온라인 Rust 컴파일러