C 언어에서 출력을 담당하는 printf() 함수를 사용해 보신적이 있으신가요?

 

자바(Java)에서도 동일한 기능을 제공하는 메소드들이 존재합니다.

 

String 클래스의 format() 메소드 : String.format()

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"102030);
        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() 메소드는 결과값으로 포맷팅된 문자열을 반환합니다.)

 

 

 

Posted by maze1008
,