rust write! format!

agnusdei·2025년 2월 5일

Rust에서 println!Display 트레이트의 관계 정리

1. 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); 실행 시 Displayfmt가 호출되어 (10, 20)이 출력됨.
  • write!(f, "({}, {})", self.x, self.y)Formatter에 문자열을 작성하는 역할.

2. 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 트레이트가 없기 때문에 {}를 사용할 수 없음.

3. 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 }
}

4. 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);

📌 최종 정리

  1. println!("{}", 값);을 사용하려면 Display 트레이트가 구현되어 있어야 함.
  2. Display를 구현하면 {}로 사람이 읽기 좋은 형식으로 출력 가능.
  3. Debug{:?}로 사용하며, 자동으로 #[derive(Debug)]로 구현 가능.
  4. format!은 문자열을 만들고, write!는 특정 버퍼에 데이터를 씀.
  5. Display는 직접 fmt 메서드를 구현해서 원하는 출력 형식을 만들 수 있음.

즉, println!에서 {}를 사용할 수 있는 이유는 내부적으로 Display 트레이트의 fmt 메서드를 호출하기 때문입니다!

profile
DevSecOps, Pentest, Cloud(OpenStack), Develop, Data Engineering, AI-Agent

0개의 댓글