포맷하는 두 가지 방법
Java는 형식 지정자(% 자리표시자)를 담은 템플릿과 그 안에 넣을 값으로 문자열을 포맷합니다. 진입점은 두 개이며, 둘은 동일한 구문을 공유합니다:
String.format(template, values...)은 새String을 반환합니다.System.out.printf(template, values...)은 결과를 곧바로 출력합니다.
둘 다 같은 텍스트를 만듭니다. String.format은 저장할 수 있도록 결과를 돌려주고, printf는 결과를 콘솔에 씁니다. printf 템플릿 끝의 %n을 눈여겨보세요 - 이는 플랫폼에 독립적인 줄바꿈입니다(형식 문자열에서는 \n보다 이것을 선호하세요).
자주 쓰는 지정자
각 지정자는 %로 시작하고, 어떤 종류의 값을 기대하는지 알려주는 글자로 끝납니다:
일상적으로 쓰는 세 가지는 %s(임의의 값, 그 값의 toString을 통해), %d(정수), %f(소수)입니다. 리터럴 퍼센트 기호를 출력하려면 %%를 사용하세요. 잘못된 타입을 넘기면 - 예를 들어 %d에 String을 넘기면 - 실행 시간에 예외인 IllegalFormatConversionException이 발생합니다.
소수점 자릿수 제어
%f는 기본적으로 소수점 여섯 자리를 쓰는데, 이는 원하는 경우가 드뭅니다. 정밀도를 고정하려면 f 앞에 .N을 넣으세요(값은 반올림됩니다):
큰 숫자의 묶음 구분 기호를 위해 콤마 플래그를 추가하세요:
너비와 패딩
%와 타입 글자 사이의 숫자는 최소 필드 너비를 정해, 열이 맞춰지도록 공백으로 채웁니다. 앞에 붙은 -는 왼쪽 정렬을, 앞에 붙은 0은 숫자를 0으로 채웁니다:
바로 이것이 포맷된 표와 정렬된 보고서를 읽기 쉽게 만듭니다:
%-8s는 이름을 너비 8의 열에서 왼쪽 정렬하고 %5d는 점수를 너비 5의 열에서 오른쪽 정렬하므로, 자릿수와 관계없이 숫자가 맞춰집니다.
인자 순서
기본적으로 지정자는 값을 왼쪽에서 오른쪽으로 소비합니다. N$(1부터 시작하는 인덱스)로 값을 반복하거나 순서를 바꿀 수 있으며, 같은 값이 두 번 나올 때 편리합니다:
%1$s는 두 번 모두 첫 번째 인자를 가리키므로 echo가 두 번 출력됩니다.
formatted() 메서드
Java 15부터 모든 문자열에 formatted 인스턴스 메서드가 있습니다 - String.format과 같은 엔진을, 템플릿에 대한 메서드 호출로 쓴 것입니다:
더 큰 포맷 출력을 만들 때 텍스트 블록(삼중 따옴표로 둘러싼 여러 줄 문자열)과 특히 잘 어울립니다.
String.format을 쓰지 말아야 할 때
단순한 일회성 결합에는 +를 이용한 평범한 연결이 더 명확하고 빠릅니다:
String greeting = "Hi, " + name + "!"; // simpler than String.format here
고정 소수점 자릿수, 패딩, 정렬, 구분 기호 같은 진짜 포맷이 필요할 때 String.format / printf를 꺼내 쓰세요. 값 몇 개를 그냥 붙이는 경우가 아니라요.
다음: 연산자
포맷은 값을 텍스트로 바꿉니다. 애초에 그 값을 계산하려면 Java의 연산자 - 산술, 비교, 논리 - 가 필요합니다. 그것이 다음 페이지입니다.
자주 묻는 질문
Java에서 문자열을 어떻게 포맷하나요?
String.format(template, values...)를 사용하세요. 이 메서드는 각 형식 지정자를 값으로 치환한 새 문자열을 반환합니다: String.format("%s is %d", name, age). 문자열을 만드는 대신 곧바로 출력하려면 같은 템플릿으로 System.out.printf(...)를 사용하세요. Java 15부터는 template.formatted(values...)도 호출할 수 있습니다.
Java에서 숫자를 소수점 둘째 자리까지 어떻게 포맷하나요?
%.2f 지정자를 사용하세요: String.format("%.2f", 3.14159)는 "3.14"를 만듭니다. 점 뒤의 숫자가 유지할 소수점 자릿수이며, 값은 반올림됩니다. 천 단위 구분 기호를 넣으려면 콤마 플래그를 추가하세요: %,.2f는 "1,234.57"을 만듭니다.
Java에서 String.format과 printf의 차이는 무엇인가요?
둘은 정확히 같은 형식 지정자를 사용합니다. String.format(...)은 포맷된 텍스트를 새 String으로 반환하므로 저장하거나 전달할 수 있습니다. System.out.printf(...)은 포맷된 텍스트를 표준 출력에 곧바로 쓰고 유용한 값을 반환하지 않습니다. 문자열을 만들려면 String.format을, 출력하려면 printf를 사용하세요.