printf() 메서드란?
Java의 printf() 메서드는 형식이 지정된(formatted) 문자열을 출력할 때 사용합니다. 이 메서드는 형식 문자열(format string) 역할을 하는 문자열 하나와, 결과 문자열에 포함될 값을 담고 있는 객체들을 인수로 받습니다. 만약 인수의 개수가 형식 문자열에서 실제로 참조하는 형식 지정자의 수보다 많다면, 초과된 객체들은 단순히 무시됩니다.
참고로 날짜와 시간을 형식화하려면 반드시 %t 또는 %T 접두사를 붙인 두 글자 형태의 변환 문자(예: %tH, %tM)를 사용해야 합니다.
시간 형식에 사용되는 형식 문자
아래 표는 Java printf() 메서드에서 시간을 형식화할 때 사용할 수 있는 다양한 형식 문자와 그 설명입니다.
| 형식 문자 | 설명 |
|---|---|
| 'H' | 해당 인수를 하루 중 시간으로 형식화합니다. 24시간제, 두 자리 숫자(00~23). |
| 'I' | 해당 인수를 하루 중 시간으로 형식화합니다. 12시간제, 두 자리 숫자(01~12). |
| 'k' | 해당 인수를 하루 중 시간으로 형식화합니다. 24시간제(0~23), 필요한 경우에만 앞자리 0을 채웁니다. |
| 'l' | 해당 인수를 하루 중 시간으로 형식화합니다. 12시간제(1~12), 필요한 경우에만 앞자리 0을 채웁니다. |
| 'M' | 해당 인수를 시간 내의 분으로 형식화합니다(00~59). |
| 'S' | 해당 인수를 분 내의 초로 형식화합니다(00~60, 윤초 허용). |
| 'L' | 해당 인수를 밀리초로 형식화합니다(000~999). |
| 'N' | 해당 인수를 나노초로 형식화합니다(000000000~999999999). |
| 'p' | 해당 인수를 오전/오후(am/pm) 마커로 형식화합니다. 로케일에 따라 한글 환경에서는 '오전/오후'로 표시될 수 있습니다. |
| 'z' | 해당 인수를 RFC 822 스타일의 숫자형 시간대 오프셋(예: +0900)으로 형식화합니다. |
| 'Z' | 해당 인수를 시간대(time zone)를 나타내는 문자열로 형식화합니다. |
| 's' | 해당 인수를 에포크(epoch, 1970년 1월 1일 00:00:00 UTC) 이후 경과한 초로 형식화합니다. |
| 'Q' | 해당 인수를 에포크 이후 경과한 밀리초로 형식화합니다. |
예제 1: Date 객체의 시간 값 형식화하기
다음 예제는 printf() 메서드를 사용하여 날짜(Date) 객체의 시간 값을 형식화해 출력하는 방법을 보여줍니다.
import java.util.Date;
public class Example {
public static void main(String args[]) {
// Date 클래스 객체 생성
Date obj = new Date();
System.out.printf("%tT%n", obj);
System.out.printf("Hours: %tH%n", obj);
System.out.printf("Minutes: %tM%n", obj);
System.out.printf("Seconds: %tS%n", obj);
}
}실행 결과
15:50:28 Hours: 15 Minutes: 50 Seconds: 28
여기서 %tT는 시:분:초를 한 번에 출력하는 복합 형식 지정자입니다.
예제 2: 12시간제와 24시간제 시간 출력하기
다음 예제는 Java printf() 메서드를 사용하여 12시간제와 24시간제 시간을 각각 출력하는 방법을 보여줍니다.
import java.util.Date;
public class Example {
public static void main(String args[]) {
// Date 클래스 객체 생성
Date obj = new Date();
System.out.printf("%tT%n", obj);
System.out.printf("Time 12 hours: %tI:%tM %tp %n", obj, obj, obj);
System.out.printf("Time 24 hours: %tH: hours %tM: minutes %tS: seconds%n", obj, obj, obj);
}
}실행 결과
11:38:08 Time 12 hours: 11:38 am Time 24 hours: 11: hours 38: minutes 08: seconds
예제 3: 인덱스 참조(1$)로 인수 재사용하기
위 예제에서는 동일한 Date 객체를 여러 번 인수로 전달하여 다양한 값을 출력했습니다. 이렇게 같은 객체를 반복해서 넘기는 대신, 인덱스 참조 1$를 사용하면 인수를 한 번만 전달하고 여러 형식 지정자에서 재사용할 수 있어 코드가 더 간결해집니다.
import java.util.Date;
public class Example {
public static void main(String args[]) {
// Date 클래스 객체 생성
Date obj = new Date();
System.out.printf("%tT%n", obj);
System.out.printf("Time 12 hours: %tI:%1$tM %1$tp %n", obj);
System.out.printf("Time 24 hours: %1$tH: hours %1$tM: minutes %1$tS: seconds%n", obj);
}
}실행 결과
11:47:13 Time 12 hours: 11:47 am Time 24 hours: 11: hours 47: minutes 13: seconds
정리
Java의 printf() 메서드로 시간을 출력할 때는 %t 접두사와 함께 목적에 맞는 형식 문자('H', 'I', 'M', 'S', 'p' 등)를 조합하면 됩니다. 또한 1$ 같은 인수 인덱스 참조를 활용하면 동일한 객체를 반복 전달하지 않고도 깔끔하게 코드를 작성할 수 있습니다.