C 언어에서 출력을 담당하는 printf() 함수를 사용해 보신적이 있으신가요?
자바(Java)에서도 동일한 기능을 제공하는 메소드들이 존재합니다.
PrintWriter 클래스와 PrintStream 클래스의 printf() 메소드 : System.out.printf()
첫 번째 매개변수가 포맷을 포함한 문자열이면(포맷 문자열, format string), 나머지 매개변수(아규먼트, argument)의 수나 타입에 제한없이 원하는 형태의 문자열을 생성 및 출력합니다.
그래서 이번에는 원하는 포맷 문자열(format string) 구성하는 방법에 대해서 알아보도록 하겠습니다.
포맷 문자열(format string)에서 %d 로 표현되는 부분은 포맷 명세자(format specifier) 라고 불리며 다음으로 입력받은 아규먼트(argument)들에 의해서 치환됩니다.
위의 예제에서 보면 %d 가 각각 순서대로 10, 20, 30으로 치환되어 "10 + 20 = 30 입니다." 라는 값을 출력합니다. 이처럼 포맷 명세자(format specifier)를 어떠한 형태로 구성하는 지에 따라 문자열의 결과값이 다르게 나타나게 됩니다.
%[인자순서$][플래그][너비][정밀도]데이터타입
포맷 명세자(format specifier) 는 다음과 같이 % 키워드로 시작됩니다.
1. 데이터타입
마지막에 위치한 데이터타입은 출력하고자 하는 데이터 구분에 따라 다른 형태로 쓰여집니다.
일반적으로 정수 %d, 실수 %f, 문자열 %s, 불리언 %b 가 이용되고 있으며 상세한 설정을 위해서는 표를 참고하시기 바랍니다.
(위의 예제에서는 정수 10 을 표현하기 위해서 %d 를 사용했습니다.)
2. 인자순서$
인자 순서는 아규먼트(argument)의 치환 순서를 지정하는 것입니다.
1$ 는 첫 번째, 2$는 두 번째, 3$ 는 세 번째 아규먼트(argument) 를 의미합니다.
예를 들어 System.out.printf(“%2$d + %1$d 은 %3$d 입니다.”, 10, 20, 30); 입력했다면
%2$d 에는 두 번째 아규먼트 20, %1$d 에는 첫 번째 아규먼트인 10, %3$d 에는 세 번째 아규먼트인 30 이 치환되어 "20 + 10 = 30 입니다." 라는 결과값이 나타날 것입니다.
3. 플래그
플래그는 부가적인 정보를 표시하기 위해 사용됩니다.
데이터를 왼쪽으로 정렬한다던가(기본으로 오른쪽 정렬), 금액을 표현할 때와 같이 일정 자리수마다 구분문자를 표시하는 등의 옵션을 설정하고 싶을 때 이용할 수 있습니다.
예를 들어 System.out.printf(“%d + %d 은 %+d 입니다.”, 10, 20, 30); 입력했다면
"20 + 10 = +30 입니다." 라는 결과값이 나타날 것입니다.
4. 너비와 정밀도
너비는 데이터를 표현할 때 얼마 정도의 공간을 차지할 것인지를 지정하는 것이고
정밀도는 소수점 아래의 값을 몇 자리까지 표현할 것인지를 나타냅니다. (정밀도는 '.숫자' 형태로 표시합니다.)
예를 들어 %5d 는 5개의 문자를 표시할 만큼의 공간이 확보하게 되고
%5.2f 는 5개의 문자를 표시할 만큼의 공간을 확보하고 그 중에서 2자리는 소수점 이하의 값을 표현하는데 사용됩니다.
System.out.printf(“파이=%5.2f”, Math.PI); 입력했다면 "파이=3.14" 라는 결과값이 나타날 것입니다.
(5자리를 표시할 수 있는 공간을 확보했지만 아규먼트(argument) 의 정수 값이 3 이므로 남은 2자리는 사용하지 않게됩니다.)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 |
import java.util.*;
public class FormatTest {
public static void main(String[] args) {
System.out.printf("%d + %d = %d 입니다. %n", 10, 20, 30);
System.out.printf("%2$s의 위도는 %1$6.4f 입니다. %n", 37.5306, "서울");
System.out.printf("%+d %n", 10);
System.out.printf("%+d %n", -10);
System.out.printf("가격:%,d원 %n", 10000000);
Calendar now = new GregorianCalendar();
System.out.printf("%1$tY/%1$tm/%1$td %1$tH:%1$tM:%1$tS %n", now);
System.out.printf("%1$tY년%1$tm월%1$td일 %1$tp %1$tH시%1$tM분%1$tS초 %n", now);
System.out.printf(Locale.US, "%tc %n", now);
}
} |
cs |
10 + 20 = 30 입니다.
서울의 위도는 37.5306 입니다.
+10
-10
가격:10,000,000원
2015/02/19 18:15:37
2015년02월19일 오후 18시15분37초
Thu Feb 19 18:15:37 KST 2015
마지막으로 설명드린 부분들을 포함한 예제입니다.
하나씩 천천히 살펴보시면 어렵지 않게 원하는 포맷 문자열(format string)을 작성하실 수 있으실 겁니다.
(예제에서는 System.out.printf() 메소드만 사용했지만 String.format() 메소드도 동일한 방법으로 이용할 수 있습니다. 다만 String.format() 메소드는 결과값으로 포맷팅된 문자열을 반환합니다.)
'IT > Java' 카테고리의 다른 글
자바 설치 - JDK 다운로드 및 설치방법 (0) | 2015.03.02 |
---|---|
문자열 분리 - split() 와 StringTokenizer 의 차이점 (0) | 2015.02.28 |
순서가 보장되는 HashMap - LinkedHashMap (0) | 2015.02.27 |
Java this 키워드 (1) | 2015.02.16 |
Java final 키워드 (0) | 2015.02.14 |