Menu
Coddy logo textTech

Debug 트레이트

Coddy Rust 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 61개 중 35번째.

Rust의 표준 라이브러리에는 일반적인 기능을 제공하는 미리 정의된 트레이트가 많이 포함되어 있습니다. 개발에 가장 유용한 트레이트 중 하나는 Debug 트레이트로, 구조체의 내용을 출력하여 검사할 수 있게 해 줍니다.

사용자 지정 구조체를 직접 출력하려고 하면 Rust는 이를 표시하는 방법을 알 수 없습니다:

struct Player {
    name: String,
    score: u32,
}

let p = Player { name: String::from("Alice"), score: 100 };
println!("{:?}", p);  // 오류! Debug가 구현되지 않음

{:?} 포매터에는 Debug 트레이트가 필요합니다. 이를 수동으로 구현하는 대신 Rust는 간단한 방법인 #[derive] attribute를 제공합니다. 이를 struct 정의 바로 위에 배치하세요:

#[derive(Debug)]
struct Player {
    name: String,
    score: u32,
}

let p = Player { name: String::from("Alice"), score: 100 };
println!("{:?}", p);  // Player { name: "Alice", score: 100 }

#[derive(Debug)] attribute는 컴파일러에 Debug 구현을 자동으로 생성하도록 지시합니다. struct의 모든 필드도 Debug를 구현하는 한 이 기능이 작동합니다(대부분의 표준 타입은 Debug를 구현합니다).

중첩된 구조를 더 읽기 쉽게 출력하려면 예쁘게 출력하는 {:#?}을 사용하세요:

println!("{:#?}", p);
// Player {
//     name: "Alice",
//     score: 100,
// }

Debug을 파생하는 것은 개발 중에 필수적입니다. 사용자 지정 서식 지정 코드를 작성하지 않고도 데이터를 빠르게 검사할 수 있습니다.

challenge icon

챌린지

쉬움

Debug 트레이트를 파생시켜 구조체를 검사할 수 있도록 만들어 봅시다! 디버깅 목적으로 항목을 출력할 수 있는 간단한 inventory 시스템을 만들게 됩니다.

코드를 두 파일에 나누어 구성합니다:

  • inventory.rs: 두 개의 public 필드인 name (String)과 quantity (u32)를 가진 public Item 구조체를 Define합니다. #[derive(Debug)] attribute를 사용하여 구조체에 Debug 트레이트를 자동으로 구현합니다.
  • main.rs: inventory 모듈을 가져오고 제공된 입력을 사용하여 Item instance를 만듭니다. 디버그 formatter {:?}를 사용하여 item의 내부 구조를 표시합니다.

Debug를 파생시키는 것의 장점은 Rust가 formatting 코드를 자동으로 생성해 준다는 것입니다. 수동 구현이 필요하지 않습니다! 구조체에 attribute만 있으면 {:?}로 printable 상태가 됩니다.

출력에는 Rust의 디버그 형식으로 item이 표시되어야 합니다:

Item { name: "{name}", quantity: {quantity} }

예를 들어 입력이 Keyboard15인 경우:

Item { name: "Keyboard", quantity: 15 }

두 개의 입력을 받습니다. item name과 quantity이며, quantity는 u32로 parse합니다.

직접 해보기

mod inventory;

use inventory::Item;

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 quantity_str = String::new();
    std::io::stdin().read_line(&mut quantity_str).expect("Failed to read line");
    let quantity: u32 = quantity_str.trim().parse().expect("Failed to parse quantity");
    
    // TODO: 주어진 name과 quantity로 Item 인스턴스 생성
    
    // TODO: 디버그 포매터 {:?}를 사용하여 item 출력
}
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

객체 지향 프로그래밍의 모든 레슨

직접 연습해 보세요: 온라인 Rust 컴파일러