CodeGym /행동 /JAVA 25 SELF /문자열 서식 지정

문자열 서식 지정

JAVA 25 SELF
레벨 9 , 레슨 2
사용 가능

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: 퍼센트 기호 이스케이프 누락.
% 기호를 출력하려면 %%를 사용하세요. 그렇지 않으면 서식 지정 과정에서 오류가 발생합니다.

코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION