Rust fmt 모듈

2023. 6. 7. 09:19Language/Rust

Rust에서 문자를 출력하기 위해서는 print!이나 println!을 사용합니다.

끝에 !(느낌표)가 붙는 것은 Rust 매크로 아래 글을 참고하시면 됩니다.

2023.03.11 - [Language/Rust] - Rust 매크로

[Rust 매크로

매크로란? Rust에서는 매크로를 지원합니다. 매크로는 메타 프로그래밍이라고 하는데, 내가 만든 Rust 코드가 새로운 Rust 코드를 만드는 것을 매크로라고 합니다. 대표적으로 우리가 많이 사용하

jandari91.tistory.com](https://jandari91.tistory.com/12)

화면에 출력하기 위해 println!()을 많이 사용하는데, 출력하기 위한 여러 포맷에 대해 알아봅시다.

std::fmt

std::fmt 모듈은 포맷 출력을 제어하는데 도움이 되는 다양한 기능들을 제공합니다.

std::fmt 모듈은 여러 가지 Trait을 제어하는데, 이를 통해 사용자 정의 데이터 타입의 포맷을 제어할 수 있습니다. 가장 많이 사용되는 Trait으로는 Disploy, Debug, LowerExp, UpperExp 등이 있습니다. 이러한 Trait을 구현하여 사용자 정의 데이터 타입을 출력 할 때 워하는 형식으로 출력할 수 있습니다.

Display Trait

우선 Display Trait을 구현해봅니다. 이 Trait을 구현하면 println! 매크로와 같은 포맷 출력 함수에서 사용자 정의 데이터 타입을 출력 할 수 있게 됩니다.

Display Trait 구현은 fmt 함수를 작성하는 것으로 이뤄집니다.

예를 들어 사용자 정의 구조체 Point2D를 출력하는 예제를 살펴보겠습니다.

use std::fmt::Display;
use std::fmt::Result;
use std::fmt::Formatter;
struct Point2D{
    x:f64,
    y:f64
}

impl Display for Point2D{
    fn fmt(&self, f:&mut Formatter<'_>) -> Result {
        write!(f, "({}, {})", self.x, self.y)
    }
}

fn main() {
    const point:Point2D = Point2D{
        x:10.0,
        y:-10.0,
    };
    println!("Point: {}", point);
}

위 예제에서 Point2D 구조체에 대해 Display Trait을 구현하였습니다.

bak@bak-Computer:~/Repository/BlogPosts/Rust/fmt$ rustc display.rs 
bak@bak-Computer:~/Repository/BlogPosts/Rust/fmt$ ./display 
Point: (10, -10)

Debug Trait 구현하기

Debug Trait을 구현하면 디버그용 출력에 사용자 정의 데이터 타입을 사용 할 수 있게 됩니다.

use std::fmt::Debug;
use std::fmt::Result;
use std::fmt::Formatter;
struct Point2D{
    x:f64,
    y:f64
}

impl Debug for Point2D{
    fn fmt(&self, f:&mut Formatter<'_>) -> Result {
        write!(f, "({}, {})", self.x, self.y)
    }
}

fn main() {
    const point:Point2D = Point2D{
        x:10.0,
        y:-10.0,
    };
    println!("Point: {:?}", point);
}
bak@bak-Computer:~/Repository/BlogPosts/Rust/fmt$ rustc debug.rs 
bak@bak-Computer:~/Repository/BlogPosts/Rust/fmt$ ./debug 
Point: (10, -10)

Debug Trait을 구현하면 println!("Point: {:?}", point); 와 같이 사용이 가능합니다.

println!("Point: {}", point);와 같이 :?를 빼게 되면 정상적으로 컴파일이 되지 않습니다.

LowerExp Trait 구현하기

LowerExp Trait은 소문자 e를 사용하여 소수를 지수 형식으로 표현 할 수 있도록 합니다.

use std::fmt::LowerExp;
use std::fmt::Result;
use std::fmt::Formatter;
struct Point2D{
    x:f64,
    y:f64
}

impl LowerExp for Point2D{
    fn fmt(&self, f:&mut Formatter<'_>) -> Result {
        write!(f, "({:.2e}, {:.2e})", self.x, self.y)
    }
}

fn main() {
    const point:Point2D = Point2D{
        x:12_345.6789,
        y:-12_345.6789,
    };
    println!("Point: {:e}", point);
}
bak@bak-Computer:~/Repository/BlogPosts/Rust/fmt$ rustc lower-exp.rs 
bak@bak-Computer:~/Repository/BlogPosts/Rust/fmt$ ./lower-exp 
Point: (1.23e4, -1.23e4)

UpperExp Trait 구현하기

UpperExp Trait은 대문자 E를 사용하여 소수를 지수 형식으로 표현 할 수 있도록 합니다.

use std::fmt::UpperExp;
use std::fmt::Result;
use std::fmt::Formatter;
struct Point2D{
    x:f64,
    y:f64
}

impl UpperExp for Point2D{
    fn fmt(&self, f:&mut Formatter<'_>) -> Result {
        write!(f, "({:.2E}, {:.2E})", self.x, self.y)
    }
}

fn main() {
    const point:Point2D = Point2D{
        x:12_345.6789,
        y:-12_345.6789,
    };
    println!("Point: {:E}", point);
}
bak@bak-Computer:~/Repository/BlogPosts/Rust/fmt$ rustc upper-exp.rs 
bak@bak-Computer:~/Repository/BlogPosts/Rust/fmt$ ./upper-exp 
Point: (1.23E4, -1.23E4)

 

소스코드

https://github.com/Jandari91/BlogPosts/tree/main/Rust/fmt

'Language > Rust' 카테고리의 다른 글

Rust의 HashMap 소개  (1) 2023.06.15
Rust Shuffle  (0) 2023.06.11
Rust에서 RabbitMQ 사용하기 (WorkQueue)  (0) 2023.06.03
if Let  (1) 2023.06.03
Rust의 Trait  (0) 2023.05.11