println!과 Display 트레이트의 관계 정리println!과 Display의 관계println!("{}", 값);을 호출하면 내부적으로 Display 트레이트의 fmt 메서드가 실행됨. Display 트레이트를 구현해야 {}로 출력 가능. Display 트레이트가 없으면 {}를 사용할 수 없고 컴파일 오류 발생. use std::fmt;
struct Point {
x: i32,
y: i32,
}
// Display 트레이트 구현
impl fmt::Display for Point {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "({}, {})", self.x, self.y)
}
}
fn main() {
let p = Point { x: 10, y: 20 };
println!("{}", p); // (10, 20) 출력
}
println!("{}", p); 실행 시 Display의 fmt가 호출되어 (10, 20)이 출력됨. write!(f, "({}, {})", self.x, self.y)는 Formatter에 문자열을 작성하는 역할. Display가 없으면 컴파일 오류 발생struct Point {
x: i32,
y: i32,
}
fn main() {
let p = Point { x: 10, y: 20 };
println!("{}", p); // ❌ 컴파일 오류: Display 트레이트 없음!
}
오류 메시지
error[E0277]: `Point` doesn't implement `std::fmt::Display`
Display 트레이트가 없기 때문에 {}를 사용할 수 없음. Debug 트레이트와 Display 차이| 트레이트 | 역할 | 포맷 방식 | 사용 예시 |
|---|---|---|---|
Display | 사람이 읽기 쉬운 출력 | {} | println!("{}", 값); |
Debug | 디버깅용 출력 | {:?} 또는 {:#?} | println!("{:?}", 값); |
Display → 사람이 읽기 좋은 형식 (사용자 출력용). Debug → 구조체 내부를 그대로 출력하는 디버깅용 포맷. Debug는 #[derive(Debug)]를 붙이면 자동 구현됨. #[derive(Debug)]
struct Person {
name: String,
age: u32,
}
impl fmt::Display for Person {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "{} ({})", self.name, self.age)
}
}
fn main() {
let p = Person {
name: String::from("Alice"),
age: 30,
};
println!("{}", p); // Display 출력: Alice (30)
println!("{:?}", p); // Debug 출력: Person { name: "Alice", age: 30 }
}
write! vs format! 차이| 매크로 | 반환값 | 주요 용도 |
|---|---|---|
format! | String 반환 | 새로운 문자열 생성 |
write! | Result 반환 | 특정한 버퍼(String, 파일 등)에 쓰기 |
let s1 = format!("Hello, {}!", "Rust"); // format! → 문자열 생성
println!("{}", s1);
let mut s2 = String::new();
write!(&mut s2, "Hello, {}!", "Rust").unwrap(); // write! → 기존 문자열에 추가
println!("{}", s2);
println!("{}", 값);을 사용하려면 Display 트레이트가 구현되어 있어야 함. Display를 구현하면 {}로 사람이 읽기 좋은 형식으로 출력 가능. Debug는 {:?}로 사용하며, 자동으로 #[derive(Debug)]로 구현 가능. format!은 문자열을 만들고, write!는 특정 버퍼에 데이터를 씀. Display는 직접 fmt 메서드를 구현해서 원하는 출력 형식을 만들 수 있음. 즉, println!에서 {}를 사용할 수 있는 이유는 내부적으로 Display 트레이트의 fmt 메서드를 호출하기 때문입니다!