코드 한 줄의 기록

Java 문자열 포맷팅 완벽 가이드: String.format과 Formatter 사용법 소개 본문

JAVA

Java 문자열 포맷팅 완벽 가이드: String.format과 Formatter 사용법 소개

CodeByJin 2025. 10. 2. 23:46
반응형

Java에서 문자열을 가공하거나 출력할 때 String.format 메서드와 Formatter 클래스를 활용하면 코드 가독성과 유지보수성을 크게 높일 수 있습니다. 본 글에서는 Java 문자열 포맷팅의 핵심 개념을 살펴보고, 실제 예제와 함께 단계별 사용법을 정리합니다. 또한 실무에서 자주 쓰이는 포맷 지정자와 주의사항을 상세히 다루어, 여러분도 쉽게 따라 하실 수 있도록 구성했습니다.

왜 문자열 포맷팅이 필요한가?

프로그래밍 과정에서 숫자, 날짜, 문자열 등을 특정 형식으로 표현해야 할 때가 많습니다.
– SQL 쿼리 생성
– 로그 메시지 출력
– 사용자에게 읽기 좋은 형태로 값 전달


이때 단순 문자열 덧셈(+)으로 처리하면 코드가 지저분해지고, 형식을 바꾸기 어렵습니다.
String.format과 Formatter를 사용하면 포맷 문자열에 자리 표시자를 넣어, 동적으로 값을 결합할 수 있어 유지보수가 편리해집니다.

String.format 기본 사용법

String result = String.format("안녕하세요, %s님! 오늘은 %d월 %02d일입니다.", "홍길동", 10, 1);
System.out.println(result);
// 출력: 안녕하세요, 홍길동님! 오늘은 10월 01일입니다.
  • %s : 문자열(String)
  • %d : 정수(Integer)
  • %02d : 2자리 정수, 빈칸 대신 0 채움
  • %.2f : 소수점 둘째 자리까지 표시하는 실수(Float/Double)

주요 포맷 지정자

지정자 설명
%s 문자열
%d 10진수 정수
%f 10진수 실수 (기본 소수점 6자리)
%x, %X 16진수 정수 (소문자, 대문자)
%o 8진수 정수
%c 단일 문자
%b 불리언 값 (true/false)
%e, %E 지수 표기법 실수
%t? 날짜/시간 (자세한 서브 지정자 필요)

 

플래그와 폭, 정밀도

  • - : 왼쪽 정렬
  • + : 부호 표시
  • 0 : 빈칸 대신 0 채움
  • , : 천 단위 구분자
  • 숫자 : 최소 폭(width) 지정
  • .숫자 : 정밀도(precision) 지정 (실수 소수점 이하, 문자열 최대 길이 등)

Formatter 클래스 활용

Formatter는 Appendable 인터페이스 기반으로, StringBuilder나 OutputStream 등에 포맷팅 결과를 바로 출력할 때 유용합니다.

Formatter fmt = new Formatter();
fmt.format("이름: %s, 점수: %d점%n", "이지은", 95);
System.out.print(fmt);
fmt.close();
  • Formatter 생성 시 Locale 지정 가능
  • format(...) 메서드는 printf와 동일한 포맷 지정 규칙을 사용
  • close()를 잊지 않도록 주의

Locale 지정 예제

Formatter fmtKR = new Formatter(Locale.KOREA);
fmtKR.format("통화: %,d원", 1234567);
System.out.println(fmtKR);
// 출력: 통화: 1,234,567원

 

서로 다른 국가별 숫자 포맷이 필요할 때 유용합니다.

printf와의 관계

System.out.printf 메서드는 내부적으로 Formatter를 사용합니다.

System.out.printf("현재 온도: %.1f℃\n", 23.7);

 

콘솔 출력 시 간편하게 포맷팅할 수 있습니다.

실전 예제

테이블 형태로 출력하기

String[] items = {"사과", "바나나", "체리"};
int[] qty = {3, 5, 2};
double[] price = {1000.0, 500.5, 2000.25};

System.out.printf("%-10s %5s %10s%n", "상품명", "수량", "단가");
for (int i = 0; i < items.length; i++) {
    System.out.printf("%-10s %5d %10.2f%n", items[i], qty[i], price[i]);
}
  • %-10s : 왼쪽 정렬, 폭 10
  • %5d : 폭 5
  • %10.2f : 폭 10, 소수점 둘째 자리

CSV 파일 생성

StringBuilder sb = new StringBuilder();
Formatter csvFmt = new Formatter(sb);

for (int i = 0; i < items.length; i++) {
    csvFmt.format("\"%s\",%d,%.2f%n", items[i], qty[i], price[i]);
}
Files.write(Paths.get("data.csv"), sb.toString().getBytes());
csvFmt.close();

 

CSV처럼 데이터를 인용부호와 쉼표로 묶어 저장할 때도 편리합니다.

성능과 주의사항

  • String.format은 내부적으로 Formatter 객체를 매번 생성하므로, 빈번한 호출이 성능 병목이 될 수 있습니다.
  • 반복문 안에서 많은 포맷팅이 필요하다면, Formatter 객체를 재사용하거나 StringBuilder + append 조합을 고려하세요.
  • 포맷 문자열 오류(IllegalFormatException) 발생 시 런타임 예외가 발생하므로, 포맷 지정자와 매개변수 타입을 반드시 일치시켜야 합니다.

팁과 트릭

  1. 정규 표현식과 병용
    포맷팅 후 문자열 검증이 필요하다면, 정규 표현식으로 패턴을 체크할 수 있습니다.
  2. 메시지 번역(국제화)
    ResourceBundle과 MessageFormat을 함께 사용하면 다국어 지원 메시지를 동적으로 처리할 수 있습니다.
  3. 커스텀 포맷터
    Formatter에 사용자 정의 변환기를 등록하여 고유한 객체를 포맷팅할 수 있습니다.

Java의 String.formatFormatter를 적절히 활용하면 문자열 조합과 출력 로직이 깔끔해지고, 다양한 포맷 요구사항을 코드 한 줄로 처리할 수 있습니다. 성능 이슈를 유의하면서, printf나 MessageFormat과 비교해 자신이 필요한 기능을 선택하시기 바랍니다. 이 가이드를 참고하여 더 읽기 쉽고 유지보수하기 좋은 문자열 포맷팅 코드를 작성해 보세요!

 

 

Java 재귀함수 완전정복: 종료조건부터 꼬리재귀까지 실무 개발자가 알려주는 모든 것

재귀함수란 무엇인가?재귀함수는 간단히 말해서 자기 자신을 호출하는 함수입니다. 복잡한 문제를 작은 단위로 나누어 해결하는 분할 정복(Divide and Conquer) 방식의 핵심이죠.public class RecursionExamp

byteandbit.tistory.com

 

반응형