프로그래밍
rust
basic_syntax
Print

프린트 함수

"{}" 출력

러스트의 프린트 함수는 다음과 같이 사용된다

let x = 100;
println!("{}", x);
 
100

이때 프린트는 위와같은 방식으로 x라는 변수를 받아서 출력된다. x의 값은 정수로 잘 출력된다.

"{:?}" Display Trait, Debug Trait

let x = vec![1,2,3,4];
println!("{x}") 
---> err
 
println!("{:?}",x)
---
[1,2,3,4]

러스트에서는 벡터나 배열같은 복합타입을 print할 때 특정 조취를 취하지 않으면 다음과 같은 오류를 나타낸다.

rustc: `Vec<{integer}>` doesn't implement `std::fmt::Display`
// 벡터타입은 디스플레이를 구현하고 있지 않습니다.
the trait `std::fmt::Display` is not implemented for `Vec<{integer}>`
// 디스플레이 트레이트는 벡터유형에 구현되지 않았습니다.
in format strings you may be able to use `{:?}` (or {:#?} for pretty-print) instead [E0277]
// 포멧 스트링에서 `{:?}`를 사용하거나 `{:#?variable}`을 사용할 수 있습니다. 

여기서 두가지 개념(트레이트와 프린트)에 대한 힌트가 나오는데 트레이트는 타입에 구현되어 사용되어지는것으로 이해할 수 있다. 만약 벡터유형에 디스플레이 트레이트가 구현되어져 있었다면 프린트함수에서 잘 출력될것으로 생각할 수 있고, 디스플레이 트레이트가 없지만 벡터유형의 경우 스트링 포멧이 필요할 때 {:?}를 사용할 수 있다는 점이다.

즉 프린트함수는 스트링 포멧을 출력하기 위한 함수로 볼 수 있고, {:?} 를 사용하여 벡터유형을 스트링포멧으로 변환시켜준다고 이해할 수 있다.

이때 "{:?}"는 출력대상(벡터) 유형이 가진 디버그 트레이트를 대상으로 한다.

트레이트에 대한 추가설명은 traits에서 확인하자.

"{x}" 프리티 프린트

원래 프린트 함수는 println!("{}", x)꼴로 작동하지만 최근 러스트에서 프리티 프린트 기능이 추가되어 println!("{x}")꼴의 형태도 출력을 지원하게 되었다.

"{:p}" 포인터 (메모리 주소)

let a = 10;
let b = &a;
println!("{:p}", b);
---
0x16cfe29dc

러스트에서는 포인터 출력을 할 수 있는데 참조형 자료를 출력할때 해당 메모리가 어딨는지 찾아낼 수 있다.

기타 출력 형식들

  • "{:x}" hexadecimal
  • "{:o}" octal
  • "{:b}" binary
  • "{:%}" percent
  • "{:,}" 큰수 천단위 구분자
  • "{:.2f}" 소수점 두자리
  • "{:.*f}" 소수점 출력