(Rust) Display와 Debug 출력 형식 비교
Rust의 println!에서 {}와 {:?}는 같은 값을 서로 다른 목적으로 출력하는데 사용
println!("{value}"); // Display
println!("{value:?}"); // Debug
{}는 Display
{:?}는 Debug
trait 구현을 사용하고 간단하게 출력하는 형태에 차이가 존재함.
서로 다른 역할과 구현 방식
Display는 사용자에게 노출할 출력 형식을 정의.
구조체의 필드 이름을 그대로 보여 주기보다 타입을 대표하는 문자열을 직접 정하는 방식.
사용자 정의 타입은 Display를 자동으로 파생할 수 없어서, fmt 메서드 안에서 `write!`로 출력 형식을 구현해야 함.
Display를 구현하면 {}뿐 아니라 to_string()도 같은 형식을 사용함.
Debug는 개발자가 값을 확인하기 위한 출력 형식.
구조체에서는 보통 타입 이름과 필드 이름, 각 필드의 값을 함께 보여 줌.
모든 필드가 Debug를 구현했다면 #[derive(Debug)]로 자동 구현할 수 있음.
{:?}는 한 줄로 출력하고 {:#?}는 alternate flag인 #를 적용해 여러 줄로 정렬함.
출력 비교
Color에 Debug를 파생하고 Display를 직접 구현하면 차이가 분명해짐.
use std::fmt;
#[derive(Debug)]
struct Color {
red: u8,
green: u8,
blue: u8,
}
impl fmt::Display for Color {
fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(
formatter,
"RGB({}, {}, {})",
self.red,
self.green,
self.blue
)
}
}
fn main() {
let color = Color {
red: 128,
green: 255,
blue: 90,
};
println!("Debug: {color:?}");
println!("Pretty Debug:\n{color:#?}");
println!("Display: {color}");
}
출력 결과는 아래와 같음.
Debug: Color { red: 128, green: 255, blue: 90 }
Pretty Debug:
Color {
red: 128,
green: 255,
blue: 90,
}
Display: RGB(128, 255, 90)
Debug는 구조체의 내부 구성을 드러내고, Display는 구현에서 정한 RGB(red, green, blue) 형식만 노출함.
출력 형식에 대한 기준
형식 사용하는 trait 용도 구현 방식
| {} | Display | 사용자에게 보여 줄 대표 문자열 | 직접 구현 |
| {:?} | Debug | 개발 중 값과 내부 구조 확인 | 주로 #[derive(Debug)] |
| {:#?} | Debug | 내부 구조를 여러 줄로 확인 | Debug 구현 사용 |
사용자 화면이나 타입의 대표 문자열에는 Display, 개발 중 상태 확인에는 Debug 사용!
다만 파생된 Debug의 출력 형식은 Rust 버전이 바뀌면서 달라질 수 있으므로 저장 형식이나 외부 통신 규격으로 사용하지 말 것!
(참고)
'Rust' 카테고리의 다른 글
| (Rust) 참조와 역참조 정리 (*, &) (0) | 2026.09.09 |
|---|---|
| (Rust) 에러 전파 연산자 정리 (0) | 2026.09.09 |
| (Rust) use와 match 정리 (0) | 2026.09.09 |
| (Rust) Copy와 Clone 차이점 정리 (0) | 2026.07.04 |
| (Rust) 소유권 (Ownership) 이해하기 (0) | 2026.07.04 |