형식화 클래스

  • java.text패키지에 포함되어 있음

  • 숫자, 날짜, 텍스트 데이터를 일정한 형식에 맞게 표현할 수 있는 방법을 객체지향적으로 설계하여 표준화

  • 형식화에 사용될 패턴을 정의

    • 데이터를 정의된 패턴에 맞춰 형식화할 수 있을 뿐만 아니라 역으로 형식화된 데이터에서 원래의 데이터를 얻어낼 수도 있음

    • 패턴을 정의하는 것이 전부라고 해도 과언이 아님



DecimalFormat

  • 형식화 클래스 중, 숫자를 형식화하는데 사용되는 것

  • 숫자 데이터를 정수, 부동소수점, 금액 등의 다양한 형식으로 표현할 수 있고 일정한 형식의 텍스트 데이터를 숫자로 쉽게 변환하는 것도 가능함

  • 사용하는 방법

    • 원하는 출력형식의 패턴을 작성하여 DecimalFormat인스턴스를 생성

    • 출력하고자하는 문자열로 format메서드를 호출

    • 원하는 패턴에 맞게 변환된 문자열을 얻게 됨

double number = 1234567.89;
DecimalFormat df = new DecimalFormat('#.#E0');
String result = df.format(number);
  • 기호와 문자가 포함된 문자열을 숫자로 쉽게 변환하는 법

    • 사용시 : Integer.parseInt 메서드 등은 콤마(,)등이 포함된 문자열을 숫자로 변환하지 못함

    • 사용법 : public Number parse(String source) throws ParseException;
      Number 클래스 = Integer, Double과 같은 숫자를 저장하는 래퍼 클래스의 조상
      doubleValue(), intValue(), floatValue() 등의 메서드가 정의되어 있음
      → Number에 저장된 값을 해당 형식으로 변환하여 반환

기호 의미 패턴 결과(1234567.89)
0 10진수(값이 없을 때는 0) 0
0.0
0000000000.0000
12345678
1234567.9
0001234567.8900
# 10진수 #
#.#
#########.####
12345678
1234567.9
1234567.89
. 소수점 #.# 1234567.9
- 음수부호 #.#-
-#.#
1234567.9-
-1234567.9
, 단위 구분자 #,###.##
#,####.##
1,234,567.89
123,4567.89
E 지수기호 #E0
0E0
##E0
00E0
####E0
0000E0
#.#E0
0.0E0
0.000000000E0
00.00000000E0
000.0000000E0
#.########E0
##.#######E0
###.######E0
.1E7
1E6
1.2E6
12E5
123.5E4
1235E3
1.2E6
1.2E6
1.234567890E6
12.34567890E5
123.4567890E4
1.23456789E6
1.23456789E6
1.23456789E6
; 패턴구분자 #,###,##+;#,###,##- 1,234,567.89+(양수일 때)
1,234,567.89-(음수일 때)
\% 퍼센트 #.#\% 123456789\%
\u2030 퍼밀(퍼센트 * 10) #.#\u2030 1234567890‰
\u00A4 통화 \u00A4 #,### \ 1,234,568
escape 문자 ’#’#,###
’’#,###
#1,234,568
‘1,234,568



SimpleDateFormat

  • 형식화 클래스 중, 날짜를 형식화하는데 사용되는 것

    • Date와 Calendar를 이용해 날짜를 계산한다면, 이 클래스는 출력하는 방법
  • Date와 Calender만으로는 날짜 데이터를 원하는 형태로 다양하게 출력하는 것이 불가능함

  • SimpleDateFormat 인스턴스

    • DateFormat : 추상클래스이자 SimpleDateFormat 클래스의 부모클래스, 추상클래스이므로 인스턴스 생성 불가
      인스턴스 생성시 getInstance()와 같은 static 메서드를 이용해야 함

    • getInstance()로 반환하는 것 → DateFormat을 상속받아 완벽히 구현한 SimpleDateFormat 인스턴스

  • 사용 방법

    • 원하는 출력형식의 패턴을 작성하여 SimpleDateFormat 인스턴스를 생성

    • 출력하고자 하는 Date 인스턴스를 가지고 fommat(Date d)를 호출하면 지정한 출력 형식에 맞게 변환된 문자열을 얻게 됨

    • Date인스턴스만 format메서드에 사용될 수 있기 때문에 Calendar 인스턴스를 Date 인스턴스로 변환해야 함

/* 오늘 날짜를 yyyy-MM-dd형태로 변환하여 반환하기
 */
Date today = new Date();
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");

String result = df.format(today);

/* Calender를 Date로 변환하기 
 */
Calendar calSunny = Calendar.getInstance();
calSunny.set(2019, 7, 13); // 2019년 8월 13일 Setting - Month는 0~11범위이므로!

Date daySunny = calSunny.getTime(); // Calendar를 Date로 변환

/* Date 인스턴스 → Calender 인스턴스 : Calender.setTime()
 */
  • SimpleDateFormat.parse(String source)

    • 문자열 source를 날짜Date 인스턴스로 변환

    • 부모클래스인 DateFormat에 정의

    • 지정된 형식과 입력된 형식이 다를 경우 예외 발생 → 적절한 예외처리 필요 (parseException)

    • 사용법
      DateFormat df = new SimpleDateFormat(“yyyy년 MM월 dd일”);
      Date d = df.parse(“2019년 8월 13일”);

    • 사용 기호

기호 의미 예시
G 연대(BC, AD) AD
y 연도 2019
M 월(1~12 또는 1월~12월) 8 또는 8월, OCT
w 년의 몇 번째 주(1~53) 12
W 월의 몇 번째 주(1~5) 3
D 년의 몇 번째 일(1~366) 123
d 월의 몇 번째 일(1~31) 13
F 월의 몇 번째 요일(1~5) 2 (→ 이번달의 N번째 화요일)
E 요일
a 오전/오후(AM, PM) AM
H 시간(0~23) 20
k 시간(1~24) 13
K 시간(0~11) 10
h 시간(1~12) 11
m 분(0~59) 50
s 초(0~59) 55
S 1/1000초 (0~999) 231
z Time zone(General time zone) GMT+9:00
Z Time zone(RFC 822 time zone) +0900
escape문자(특문표현)
‘(따옴표)는 escape 문자이기 때문에, 사용하려면 escape 문자를 붙여서 ‘‘
없음



ChoiceFormat

  • 형식화 클래스 중, 특정 범위에 속하는 값을 문자열로 변환하는 것

  • 연속적 또는 불연속적인 범위의 값들을 처리할 때 if나 switch문은 부적절한 경우가 많음
    → 이럴 경우 ChoiceFormat을 사용하면 복잡하게 처리될 수밖에 없었던 코드를 간단하고 직관적으로 만들 수 있음

  • 사용방법

    • ChoiceFormat(double[] limits, String[] grades)

    • ChoiceFormat (String newPattern)

/* ChoiceFormat(double[] limits, String[] grades)
 * limits, grades간의 순서와 개수를 맞춰야 함
 * limits : double, 반드시 모두 오름차순으로 정렬되어있어야 함
 * grades : String, 치환 될 문자열의 개수 = limits에 정의된 개수
 *                  → 다를 경우 ArgumentException 발생
 */
double[] limits = {60, 70, 80, 90};
String[] grades = {"D", "C", "B", "A"};

int[] scores = { 100, 95, 88, 70, 52, 60, 70 };

ChoiceFormat form = new Choice Format(limit, grades);

for(int i = 0; i < scores.length; i++) {
    System.out.print(scores[i] + ":" + form.format(scores[i]) + ", ");
}

// 100:A, 95:A, 88:B, 70:C, 52:D, 60:D, 70:C, 


/* ChoiceFormat(String newPattern)
 * pattern : 배열대신 패턴을 사용하여 간결하게 처리
 *           # : 경계값을 범위에 포함, <:경계값은 포함하지 않음
 *           90#A = 90이상은 A,       80<B, 80초과는 B
 */
String pattern = "60#D|70#C|80<B|90#A";
int[] scores = {91, 90, 80, 88, 70, 52, 60};

ChoiceFormat form = new ChoiceFormat(pattern);

for(int i = 0; i < scores.length; i++) {
    System.out.print(scores[i] + ":" + form.format(scores[i]) + ", ");
}

// 91:A, 90:A, 80:C, 88:B, 70:C, 52:D, 60:D



MessageFormat

  • 형식화 클래스 중, 데이터를 정해진 양식에 맞게 출력할 수 있도록 해주는 것

  • 데이터가 들어갈 자리를 마련해놓은 양식을 미리 작성 후 프로그램을 이용해서 다수의 데이터를 같은 양식으로 출력할 때 사용

  • 예시

    • 고객들에게 보낼 안내문을 출력할 때 같은 안내문 양식에 받는 사람의 이름과 같은 데이터만 달라지도록 출력할 때

    • 하나의 데이터를 다양한 양식으로 출력할 때 사용

    • SimpleDateFormat의 parse처럼 MessageFormat을 이용하면 지정된 양식에서 필요한 데이터만을 손쉽게 추출해낼 수 있음

  • 따옴표(‘)는 MessageFormat 양식에서 escape문자로 사용되기 때문에 문자열 msg내에서 따옴표를 사용하려면 두 번 연속으로 사용하면 됨 (ex : ‘’)

  • 사용 방법과 예

import java.text.*;

class Sunny {
    public msg = "S: {0} \nU: {1} \nN: {2}";
    
    Object[] arguments = {
        "고구마", "true", "15"
    };
    
    String sunny = MessageFormat.format(msg, arguments);
    
    System.out.println(sunny);
}

/* S: 고구마
 * U: true
 * N: 15
 */
 
import java.text.*;

class Sunny2 {
    public msg = "S: {0} U: ''{1}'' N: {2}"; // 따옴표(')는 MessageFormat양식의 escape문자
                                             // '로 사용하려면 ''로 사용
    
    Object[][] arguments = {
        {"고구마", "true", "15"},
        {"감자", "false", "12"},
    };
    
    for (int i = 0; i < arguments.length; i++) {
    	String sunny = MessageFormat.format(msg, arguments[i]);
    	System.out.println(sunny);
    }

}

/* S: 고구마 U: 'true' N: 15
 * S: 감자 U: 'false' N: 12
 */
  • MessageFormat에 사용할 양식인 문자열 msg를 작성할 때, ‘{숫자}’로 표시된 부분 → 데이터가 출력될 자리

    • 순차적일 필요 없음

    • 여러번 반복해서 사용 가능

    • 사용되는 숫자는 배열처럼 인덱스가 0부터 시작

    • 양식에 들어갈 데이터는 객체배열인 arguments에 지정

    • 객체배열이기 때문에 String 이외에도 다른 객체들이 지정될 수 있음

    • 보다 세부적인 옵션들 사용 가능 → Java API 문서 참조

  • 출력된 데이터로부터 필요한 데이터를 뽑아내는 방법 (parse(String source) 사용)

    • 데이터를 객체배열에 직접 초기화
      → 데이터가 바뀔 때 마다 매번 배열을 변경해야 하고 다시 컴파일을 해줘야 함

    • 불편을 없애기 위해 Scanner를 통해 데이터를 제공받으면, 데이터가 변경되어도 다시 컴파일을 하지 않아도 됨

String msg = "Sunny {0}" + "{1}, {2}, {3}";

String pattern = "{0}, {1}, {2}, {3}";
MessageFormat mf = new MessageFormat(pattern);

Object objs = mf.parse("'Sunny123', '02-123-1234', 27, '08-09'");

System.out.println(MessageFormat.format(msg, objs));

// "Sunny 'Sunny123''02-123-1234', 27, '08-09'