[JAVA] Formatter 클래스 format(), 날짜 format()

2019. 10. 7. 11:48 JAVA/Java

Formatter 클래스 format()



1. Formatter 클래스


JDK 1.5 버전에서는 C 언어의 printf 문과 같은 출력 형태를 지정하도록 java.util.Formatter 라는 클래스를 제공한다.

Formatter 클래스는 형식 문자열을 제공하고 이 문자열에서 지정한 대로 데이터가 형식화 된다.


Formatter 클래스를 이용하기 위해서는 형식화된 출력이 지정될 Appendable 인터페이스를 구현한 클래스를 사용해야 한다. Formatter에서 형식화된 문자열을 만들었을 때, 결과가 저장되는 곳이다.

Appendable 인터페이스를 구현한 클래스는 StringBuffer, PrintStream,FileWriter 등 약 14개의 클래스가 있다.


Formatter f = new Formatter(Appendabel a);


* Formatter 사용 예


 

import java.util.Formatter;


public class FormatterTest {

    public static void main(String[] args) {
       
       // Formatting 결과를 담을 StringBuffer를
       // Formatter 객체 선언시 지정
        StringBuffer sb = new StringBuffer();
        Formatter f = new Formatter(sb);
       
        String s = "로그인 성공";
        String user = "하이언";
        int i = 10;
       
       // 해당 Format을 지정할 때마다, StringBuffer 객체에 저장
        f.format("%s%n", s);
        f.format("%s님 %d번째 방문", user, i);
       
       // formatter의 StringBuffer에 저장된 값들을 출력
        System.out.println(f);
       
        f.close();
       
    }

}



C 언어를 공부하신 분들은 저 format 형식이 반갑게 느껴질 것이고(오히려 편하다고 느낄지도), 처음 JAVA를 접한 분들은 이해가 잘 안되실거 같습니다.


Formatter 라는 클래스는 format() 이라는 메소드로 특정한 형식을 지정합니다. %d 는 이 자리에 숫자형 데이터가 매칭된다는 의미이며, 뒤에 오는 매개변수의 값들과 매칭이되어 적용됩니다.

따라서 format type들(%d,%c,%s...) 들의 갯수와 타입이 뒤에 따라오는 매개변수들과 일치를 해야 합니다.


당장은 왜 저렇게 불편하게 하는지 궁금하실 수 있지만, 위와같이 "OO님 O번째 방문" 이라는 형식의 데이터를 값만 바꿔서 여러 곳에서 사용해야 할 때 유용하게 사용할 수 있다.


Formatter의 내용을 출력할 때 Formatter.toString()을 사용했지만, 실제로 데이터는 Formatter를 선언할 때 지정한 StringBuffer() 객체에 들어가므로  System.out.println(sb)로 사용해도 결과는 같다.



2. format()


Formatter 클래스 자체를 사용하는 것은 편리하지만 형식화된 출력을 위해서 매번 Formatter 를 생성하는 것은 불편하다.

그래서 String 클래스와 PrintStream, PrintWriter 클래스에서는 format() 메소드를 제공하여 Formatter의 기능을 대신할 수 있다.


String s= String.format();


* format()의 사용 예



public class FormatterTest {

    public static void main(String[] args) {
       
        String user = "하이언";
        int i = 10;
       
        String sf = String.format("%s님 %d번째 방문", user, i);
       
        System.out.println(sf);

    }

}

 



이제 사용하기 훨씬 편해졌다.



3. Formatter 클래스의 format들


Formatter에 사용하는 format들 (%d, %s...) 에는 다양한 형식과 타입을 지원한다.


%[인자순서$][플래그][너비][정밀도]데이터 타입


위 구조에서 필수적으로 사용되어야 하는 부분은 데이터 타입이다.

데이터 타입은 지정된 format에 대응되는 데이터의 타입을 지정한다.


옵션으로 너비는 출력되는 최대의 길이 이며, 이때 너비는 소수점, 지수부 등이 포함되는 길이다.

만약 출력할 크기가 지정된 너비보다 크면 그 이상은 무시된다.


정밀도는 일반적인 실수형이나 지수형의 표현시에 소수점 이하로 출력되는 길이를 의미한다.


* 데이터 타입 옵션


 format

설명 

 %B, %b

- 논리형 데이터에 사용

- %b 는 "true"나 "false"의 형태로 출력된다.

- %B 는 "TURE"나 "FALSE"의 형태로 출력된다. 

 %C, %c 

- 문자형 데이터에 사용

- 사용 가능한 데이터는 Byte, Short, Character, Integer 등 문자 표현 가능 Wrapper 클래스이다.

[JAVA] Wrapper class 란? 그리고 AutoBoxing

 %d

- 10진수 정수형 데이터에 사용

- 사용 가능한 데이터는 Byte, Short, Integer, Long, BigInteger 등 정수 표현 가능 Wrapper 클래스이다. 

 %e 

- 10진수 지수형 데이터에 사용

- 사용 가능한 데이터는 Float, Double, BigDecimal 등 지수 표현 가능 Wrapper 클래스이다. 

 %f 

- 일반적인 실수형 데이터에 사용

- 사용 가능한 데이터는 Float, Double, BigDecimal 등 실수 표현 가능 Wrapper 클래스이다. 

 %x

- 16진수 정수형 데이터에 사용

- 사용 가능한 데이터는 Byte, Short, Integer, Long, BigInteger 등 정수 표현 가능 Wrapper 클래스 

 %o 

- 8진수 정수형 데이터에 사용

- 사용 가능한 데이터는 Byte, Short, Integer, Long, BingInteger 등 정수 표현 가능 Wrapper 클래스 

 %s

- 객체의 문자열 데이터에 사용

- 해당 객체의 toString() 메소드의 결과가 출력된다. 

 %t 

- 날짜형 데이터에 사용

- 부가적인 옵션이 필요하고 Date, Calendar 클래스에 사용한다. 

 %n

- 개행처리에 사용.
- 대응되는 매개변수 값이 없어도 사용 가능하다 

 %% 

- % 문자 출력에 사용
- 대응되는 매개변수 값이 없어도 사용 가능하다 



4. %t 날짜 format 사용


Date나 Calendar 클래스를 매개변수로 받아 날짜를 출력하는 %t format에는 부가적인 옵션이 붙는다.


* %t 날짜 format


날짜 타입 format 

설명 

 %tA 

- 요일 출력 

 %tY 

- 4자리 년도 출력 

 %tB

- 월의 이름(영어의 경우 January, February..) 출력 

 %tm 

- 01 ~ 12 로 표현하는 월 출력 

 %te 

- 1 ~ 31 로 표현하는 해당 월의 날짜 출력 

 %tk

- 0 ~ 23 으로 표현하는 시 출력 

 %tl 

- 1 ~ 12로 표현하는 시 출력 

 %tM 

- 00 ~ 59 로 표현하는 분 

 %tS 

- 00 ~ 59 로 표현하는 초 

 %tZ

- 타임존 출력 


날짜 타입 format에 매칭되는 데이터 타입은 그저 Date나 Calendar 를 넣어주면 된다.


* 날짜 format 사용 예


 

import java.util.Calendar;
import java.util.Formatter;
import java.util.Locale;


public class FormatterTest {

    public static void main(String[] args) {
       
        StringBuffer sb = new StringBuffer();
        Formatter f = new Formatter(sb);
        Calendar c = Calendar.getInstance();
       
        f.format("오늘은 %tY 년 %tm월(%tB) %te일 입니다. %n", c,c,c,c);
        f.format("현재 시간은 %tk 시 %tM분 %tS초 입니다. %n", c,c,c);
        f.format("타임존 : %tZ %n", c);
       
        f.format(Locale.US, "이번달은 영어로 %tB 입니다.", c);
        System.out.println(f);

    }

}



위의 날짜 format에서 필요한 타입을 사용하면 되며 매칭되는 매개변수는 Calendar c 를 사용하였다.


%tB 의 경우 현재 "월" 을 각 지역의 부르는 호칭으로 변환되어 출력한다.


기본 Locale 은 현재 지역으로 되어있어, 한국에서의 표기법인 "1월" 이 출력됐지만, Locale을 US로 변경하여 format을 시행하니 January로 변경된 것을 알 수 있다.


여기의 주요 날짜 format 들은 잘 알아두면 유용하다.



JAVA에서는 이 Formatter 클래스를 확장한 다양한 클래스들을 제공한다.

특히 숫자 포맷을 지정하는 NumberFormat, 패턴을 지정하는 DecimalFormat 

그리고 날짜 포맷을 지정하는 SimpleDateFormat 등이 있다.


JAVA DOC API



출처: https://hyeonstorage.tistory.com/231?category=557602 [개발이 하고 싶어요]