더북(TheBook)
        -> Result<(), std::fmt::Error> {
        write!(f, "id: {}", self.0)
    }
}

impl std::fmt::Debug for Question {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) 
        -> Result<(), std::fmt::Error> {
        write!(f, "{:?}", self.tags)
    }
}
...

Debug 트레이트의 구현은 Display 트레이트와 매우 닮았다. 여기에서는 write! 매크로에 {} 대신 {:?}를 사용한 것만 다르다. 사용자 정의 타입을 구현하고 표시할 때마다 이 코드를 모두 작성하는 것은 상당히 번거로운 일이다.

러스트 표준 라이브러리의 derive라는 절차적 매크로를 사용하면 이런 번거로운 문제를 해결할 수 있다. #[derive] 애너테이션을 구조체 정의 위에 놓기만 하면 된다. Display 트레이트에 대한 문서에서도 중요한 사실을 알 수 있다. 문서에는 ‘DisplayDebug와 유사하지만, Display는 사용자가 보기 위한 출력용이므로 파생(derive)될 수 없다’라는 내용이 있다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.