1. 수동 문자열 연결의 문제
변수 한두 개만 출력할 때는 + 연산자가 정말 편합니다. 하지만 데이터가 많아지면 연결은 금세 혼란스러워지고, 특히 숫자 서식 지정(예: 소수점 이하 2자리)이나 줄바꿈이 필요할 때는 더더욱 그렇습니다.
String name = "올레그";
int age = 25;
double balance = 12345.67;
System.out.println("이름: " + name + ", 나이: " + age + ", 잔액: " + balance + " 유로.");
연결 내부에서 서식을 끼워 넣으려는 시도는 가독성만 더 떨어뜨립니다:
System.out.println("이름: " + name + ", 나이: " + age + ", 잔액: " + String.format("%.2f", balance) + " 유로.");
결론: 단순 연결은 사소한 경우에만 좋고, 복잡한 메시지에는 더 강력한 도구 — String.format() — 가 필요합니다.
2. String.format — 제대로 문자열 서식 지정하기
메서드 String.format()은 템플릿에 따라 문자열을 만들고 지정한 위치에 값을 끼워 넣을 수 있게 해줍니다.
일반 형태:
String result = String.format("템플릿", znacheniya);
- %s — 문자열
- %d — 정수
- %f — 부동소수점 수
- %n — 줄바꿈(크로스 플랫폼)
String name = "올레그";
int age = 25;
double balance = 12345.6789;
String info = String.format("이름: %s, 나이: %d, 잔액: %.2f 유로.", name, age, balance);
System.out.println(info);
// 출력: 이름: 올레그, 나이: 25, 잔액: 12345.68 유로.
String result = String.format("이름: %s, 나이: %d, 잔액: %.2f 유로", name, age, balance);
// %s — 문자열, %d — 정수, %.2f — 소수점 이하 2자리
숫자와 문자열 서식 지정
고정된 소수 자릿수:
double price = 99.999;
System.out.println(String.format("가격: %.2f 유로.", price)); // 가격: 100.00 유로.
필드 폭과 정렬:
int n = 7;
System.out.println(String.format("숫자: [%5d]", n)); // 숫자: [ 7]
System.out.println(String.format("숫자: [%-5d]", n)); // 숫자: [7 ]
[5d] — 필드 폭은 5, 기본은 오른쪽 정렬;
[-5d] — 필드 폭은 5, 왼쪽 정렬.
문자열 정렬:
String text = "Java";
System.out.println(String.format("[%10s]", text)); // [ Java]
System.out.println(String.format("[%-10s]", text)); // [Java ]
퍼센트:
double percent = 0.125;
System.out.println(String.format("완료: %.1f%%", percent * 100)); // 완료: 12.5%
퍼센트 기호를 출력하려면 %%를 사용하세요.
날짜 서식 지정(간단히)
import java.util.Date;
Date now = new Date();
System.out.println(String.format("오늘: %tD", now)); // 오늘: 06/18/24
System.out.println(String.format("시간: %tT", now)); // 시간: 15:42:07
로케일과 구분 기호
기본적으로 시스템 로케일이 사용됩니다. 원하는 로케일(예: 소수 구분자로 콤마 사용)을 지정하려면 로케일을 전달하세요 — 예를 들어 Locale.FRANCE.
import java.util.Locale;
double price = 1234.56;
System.out.println(String.format(Locale.FRANCE, "%.2f", price)); // 1234,56
실전 예제
예제 1: 짧은 보고서
String name = "안나";
int tasks = 5;
double hours = 12.3456;
String report = String.format(
"직원: %s%n완료한 작업: %d%n소요 시간: %.1f",
name, tasks, hours
);
System.out.println(report);
/* 출력:
직원: 안나
완료한 작업: 5
소요 시간: 12.3
*/
예제 2: 정렬된 표
String header = String.format("%-10s | %5s | %8s", "이름", "점수", "시간");
String row1 = String.format("%-10s | %5d | %8.2f", "올레그", 95, 10.5);
String row2 = String.format("%-10s | %5d | %8.2f", "안나", 100, 9.75);
System.out.println(header);
System.out.println(row1);
System.out.println(row2);
/* 출력:
이름 | 점수 | 시간
올레그 | 95 | 10.50
안나 | 100 | 9.75
*/
예제 3: 혼합 텍스트
int apples = 12;
int pears = 8;
System.out.println(String.format("저는 사과 %d개와 배 %d개가 있습니다.", apples, pears));
3. 실습: 우리 애플리케이션에서 문자열 서식 지정
콘솔 애플리케이션에 서식을 추가해 봅시다: 잔액은 항상 소수점 둘째 자리까지, 줄바꿈은 %n으로.
Scanner console = new Scanner(System.in);
System.out.print("이름을 입력하세요: ");
String name = console.nextLine();
System.out.print("나이를 입력하세요: ");
int age = console.nextInt();
System.out.print("잔액을 입력하세요: ");
double balance = console.nextDouble();
// 형식화된 출력
String info = String.format("이름: %s, 나이: %d, 잔액: %.2f 유로.", name, age, balance);
System.out.println(info);
시도해 보세요:
- 서로 다른 값을 입력해 보고 잔액이 항상 소수점 둘째 자리까지 출력되는지 확인하세요(%.2f).
- %n을 사용해 줄바꿈이 들어가도록 템플릿을 수정해 보세요.
4. 문자열 서식 지정 시 흔한 오류
오류 № 1: 타입과 마커 불일치.
%d에는 문자열을, %s에는 숫자를 넣을 수 없습니다.
String.format("나이: %d", "스무"); // 오류: 숫자를 기대하지만 문자열이 전달됨
오류 № 2: 인수 순서를 바꿈.
템플릿이 %s %d인데 숫자를 먼저, 그다음 문자열을 전달하면 오류가 나거나 잘못된 출력이 됩니다.
오류 № 3: 로케일을 무시함.
소수 구분자로 콤마를 기대했는데 점이 보인다면 — 원하는 로케일을 String.format(...)의 첫 번째 매개변수로 명시하세요.
오류 № 4: 퍼센트 기호 이스케이프 누락.
% 기호를 출력하려면 %%를 사용하세요. 그렇지 않으면 서식 지정 과정에서 오류가 발생합니다.
GO TO FULL VERSION