write! 사용 용도

백엔드&인프라 추종자·2025년 6월 18일

rust 공부

목록 보기
8/14

개인생각

format! 도 있으나 항상 새로운 힙할당이 일어나므로 성능면에서 떨어짐.

포맷팅 가능하면서 힙할당없이(capacity 초과시 재할당은 있음) 가능한 매크로이므로

format! 의 장점은 취하면서도 단점은 보완된 매크로같다.


훌륭한 질문입니다. 정말로 단순히 문자열을 덧붙이는 목적이라면 push_str만으로 충분합니다.
그렇다면 write!가 따로 존재할까요? 이유는 다음과 같습니다:


write!가 필요한 진짜 이유

1. format! 수준의 포맷팅 기능push_str처럼 효율적으로 사용하고 싶을 때

use std::fmt::Write;

let mut s = String::new();
let name = "Rust";
let ver = 2021;
write!(&mut s, "Hello, {} {}!\n", name, ver).unwrap();
  • ✅ 변수 삽입, 숫자 포맷 등 다양한 포맷 가능 (format!과 동일한 포맷 문법 지원)
  • ✅ 하지만 새로운 String을 생성하지 않고 기존 String에 직접 추가 → 성능상 훨씬 유리
  • 🔁 이 점에서 write!format!push_str의 장점을 결합한 형태

2. 범용성: String 말고도 다른 출력 버퍼에 쓸 수 있음

write!std::fmt::Write 트레잇을 기반으로 하므로,
다양한 출력 대상에 포맷된 데이터를 쓸 수 있습니다.

예:

fn render_html(output: &mut dyn std::fmt::Write) {
    write!(output, "<h1>Hello</h1>").unwrap();
}
  • 이 함수는 String, &mut String, &mut MyWriter 등 어떤 버퍼든 받음
  • 범용 텍스트 렌더링 함수 작성 가능

3. 표준화된 포맷팅 방식

  • write!format_args!와 함께 작동하여 안정성, 안전성, 성능 최적화가 검증된 방식
  • 포맷 오류는 컴파일 타임에 검사 (예: {}와 인자 개수 불일치 시 에러)

✅ 요약 비교

기능push_strwrite!
단순 문자열 추가✅ 빠르고 간단⛔ 불필요하게 복잡
포맷팅 지원❌ 없음✅ format!과 동일한 문법 지원
다양한 출력 대상 지원String에만 적용✅ 모든 fmt::Write 대상 가능
효율성🥇 가장 빠름🥈 아주 빠름 + 포맷 지원
반복 포맷에 적합✅ 특히 반복 렌더링에 적합

🎯 결론

  • 👉 단순한 문자열 붙이기만 필요하다면 push_str
  • 👉 변수 삽입, 숫자 포맷 등 포맷팅이 필요하면 write!
  • 👉 반복문 안에서 포맷팅 누적할 땐 write!가 성능/가독성 모두 우수

💡 write!format!보다 성능이 훨씬 좋고, push_str보다 표현력이 좋기 때문에 중간 단계 역할로 매우 유용합니다.
필요하시면 실제 성능 비교 벤치마크 코드를 제공해드릴 수 있습니다.

profile
AI 답변 글을 주로 올립니다.

0개의 댓글