-J2SE5.0 이전에는 여러 형태의 데이터를 형식화된 출력으로 만들기 위해 문자열 변환 메서드와 + 연산자를 통해서 작업해야했다.
-J2SE5.0 은 java.util.Formatter 클래스를 통해 강력하면서 유연한 포매팅 기능을 추가했다.
-Formatter 클래스는 객체를 생성하고 Formatter 클래스의 메소드를 호출하기도 하지만 System.out.printf()나 String 클래스의 format()을 주로 사용한다.
아래와 같은 데이터가 있다고 가정해보자.
float a = 32.4311;
float b = 82.121323;
소수점 4자리까지만 끊어서 출력하고자 할 때, JDK 5.0에서 제공하는 Formatter 클래스를 이용할 수 있다.
Formatter 를 사용하기 위해서는 형식화된 출력이 저장될 Appendable 인터페이스를 구현할 클래스를 사용해야 한다.
결과가 저장될 클래스가 결정되었으면 다음과 같은 형태로 Formatter의 인스턴스를 만들면 된다.
Formatter format = new Formatter(Appendable a)
예를 들어 StringBuffer에 대해서 Formatter를 지정하고 싶다면, 다음과 같이 Formatter 인스턴스를 만들면 출력 결과가 지정된 StringBuffer에 저장된다.
StringBuffer sb = new StringBuffer();
Formatter f = new Formatter(sb);
Formatter 인스턴스가 만들어진 후에는 format() 메서드를 통해서 형식화된 출력을 한다.
Formatter format (String format, Object ... args)
첫번째 인자는 출력하고 싶은 문자열 형태로 지정하고 그 중간에 %로 시작하는 형식화 인자를 지정한다.
단, 형식화 인자는 몇개를 넣어도 상관없지만 두번째 인자인 비정형 인자는 형식화 인자의 수만큼의 데이터가 필요하다.)
예>
{code}
StringBuffer sb = new StringBuffer();
Formatter f = new Formatter(sb);
int a = 10;
int b = 20;
f.format("%d과 %d을 더하면 %d이 됩니다", a, b, a+b); //데이터가 3개인 것을 알 수 있다.
h2. 2. Formatter 형식화 인자
h3. 2.1. 데이터형 형식화 인자
||인자형태||설명||
|%b,%B|주로 논리형 데이터에 사용된다. %b 일때는 "true, false"로 나오고 %B인 경우에는 "TRUE, FALSE"로 나온다.|
|%c,%C|문자형 데이터에 사용된다. 사용 가능한 데이터는 Byte, Short, Character, Integer 이다.|
|%d|10진수 정수형으로 표현된다. Byte, Short, Integer, Long, BigInteger 등이 사용 가능하다.|
|%e|10진수의 지수형으로 표현된다. Float, Double, BigDecimal 등이 사용 가능하다.|
|%f|일반적인 실수형 데이터를 표현할 때 사용된다. Float, Double, BigDecimal에 사용된다.|
|%x|16진수 표현을 할 때 사용한다. Byte, Short, Integer, Long, BigInteger에 사용된다.|
|%o|8진수 표현을 할 때 사용한다. Byte, Short, Integer, Long, BigInteger에 사용된다.|
|%s|데이터의 문자열 출력을 하게 된다. 이때 주어진 객체의 toString() 메서드의 결과인 문자열이 대응되게 된다.|
|%t|날짜를 표시할 때 사용한다. 부가적인 옵션이 필요하며 다음 표에서 설명한다. Date, Calendar 등을 지정할 때 사용한다.|
|%n|줄 바꿈을 할 때 사용한다. 대응되는 인자가 없어도 된다.|
|%%|%를 표시할 때 지정한다. 대응되는 인자가 없어도 된다.|
h3. 2.2. 날짜에 대응되는 형식화 인자
||인자형태||설명||
|%tA|요일|
|%tY|4자리로 표현되는 연도|
|%tB|월의 이름(영어인 경우에는 January, Feburary,...)|
|%tm|01~12로 표현되는 월|
|%te|1~31까지의 해당 월에서의 날짜|
|%tk|0~23으로 표현되는 시|
|%tl|1~12fh 표현되는 시|
|%tM|00~59로 표현되는 분|
|%tS|0~59로 표현되는 초|
|%tZ|타임 존|
h2. 3. Formatter 예제
bq. *소스*
package dfi.study.java;
import java.util.*;
public class FormatterTest01
{
public static void main(String[] args)
{
StringBuffer sb = new StringBuffer();
Formatter f = new Formatter(sb); //Formatter 인스턴스 생성.
f.format("숫자는 : %d, %f, %e, %x, %o\n", 255, 34.2, 34.2, 255, 255);
System.out.println(sb);
sb.delete(0, sb.length()); //StringBuffer의 내용을 지움.
f.format("문자는 : %c, %s %n", 'A', "하하하");
System.out.println(sb);
sb.delete(0, sb.length());
Calendar now = Calendar.getInstance();
f.format("현재 날짜는 : %tY년 %tB %te일", now, now, now);
System.out.println(sb);
sb.delete(0, sb.length());
f.format("현재 시간은 : %tk시 %tM분 %tS초 %n", now, now, now);
System.out.println(sb);
}
}
bq. *실행결과*
!Formatting02.jpg!
h2. 4. String에서 사용예제
- Formatter를 편리하게 형식화된 출력을 얻을 수 있지만, 매번 Formatter를 생성하는 것은 조금 불편할 일이다.
- 때문에 String 클래스, PrintStream 클래스, PrintWriter 클래스에서 format()라는 메서드를 지원하고 있다.
- String 클래스의 format() 메서드는 다음과 같이 선언한다.
public static String format(String format, Object...args)
bq. *소스*
package dfi.study.java;
public class StringBuilderTest03
{
public static void main(String[] args)
{
String str = String.format("숫자는:%5d, %6.2f, %6.4f, %6.2e, %6.4e", 255, 343.243, 343.243, 343.243, 343.243, args);
System.out.println(str);
System.out.println(String.format("test_01 : %,d",1000000000));
System.out.println(String.format("test_02 : %d",42));
System.out.println(String.format("test_03 : %.3f",42.000000));
System.out.println(String.format("test_04 : I have %,.2f bugs to fix",476578.09876));
}
}
bq. *실행결과*
!Formatting03.jpg!
-%5d는 최소한 5자리를 출력. 결과를 보면 앞의 2자리가 비어있음을 알 수 있다.
-%6.2f는 최소한 6자리를 출력하는데 정밀도를 2로 한다. 결과는 6자리로 출력되지만 소수점 2자리까지만 출력된다.
-%6.4f는 최소한 6자리를 출력하는데 정밀도를 4로 한다. 결과는 6자리로 출력되지만 소수점 4자리로 되어있기 때문에 총 8자리 출력된다.
-%6.2e는 최소한 6자리를 출력하는데 정밀도를 2로 한다. 결과는 데이터의 밀수 3.43과 지수부가 표시되기 때문에 8자리가 출력된다.