형식화 클래스
데이터를 일정한 형식으로 정리하고 싶을때 또는 원하는 형식으로 출력하고 싶을 때, 자바에서 이를 쉽게 해결할 수 있는 방법을 제공하는데 그 것이 바로 형식화 클래스이다.
이 클래스는 java.text패키지에 포함되어 있으며 숫자, 날짜, 텍스트 데이터를 일정한 형식에 맞게 표현할 수 있는 방법을 객체지향적으로 설계하여 표준화하였다.
형식화 클래스는 형식화에 사용될 패턴을 정의하는데, 데이터를 정의된 패턴에 맞춰 형식화할 수 있을 뿐만 아니라 역으로 형식화된 데이터에서 원래의 데이터를 얻어낼 수도 있다.
형식화 클래스에서는 원하는 형식으로 표현 또는 변환하기 위해서 패턴을 정의하는데, 형식화 클래스에서는 패턴을 정의하는 것이 전부라고 해도 과언이 아니다.
DecimalFormat
형식화 클래스 중에서 숫자를 형식화 하는데 사용되는 것이 DecimalFormat이다.
숫자 데이터를 정수, 부동소수점, 금액 등의 다양한 형식으로 표현할 수 있으며, 반대로 일정한 형식의 텍스트 데이터를 숫자로 쉽게 변환하는 것도 가능하다.
-사용하는 방법(숫자 -> 원하는 형식의 문자열)
- 원하는 출력형식의 패턴을 작성
- DecimalFormat인스턴스를 생성
- 출력하고자 하는 숫자데이터를 넣어 format메서드를 호출
double number = 1234567.89;
DecimalFormat df = new DecimalFormat("#.#E0");
String result = df.format(number);
-parse메서드 (특정 문자열 -> 숫자)
parse메서드를 이용하면 기호와 문자가 포함된 문자열을 숫자로 쉽게 변환할 수 있다.
parse(String source)는 DecimalFormat의 조상인 NumberFormat에 정의된 메서드이며, 이 메서드의 선언부는 다음과 같다.
public Number parse(String source) throws ParseException
-참고 패턴
Format | 설명 |
0 | 10진수, 값이 없는 자리는 0으로 채움 |
# | 10진수, 값이 없는 자리는 나타나지 않음 |
. | 소수점을 이하 나타냄 |
- | 음수 부호를 나타냄 |
, | 단위 구분자를 나타냄 |
E | 지수 기호를 나타냄, E 이후 0를 써서 표현(ex E0) |
% | 퍼센트 기호 |
' | escape문자, 만약 #을 문자로 나타내고 싶다면 '#' 으로 표현 |
그외 문자 | 문자로 취급 |
SimpleDateFormat
Date와 Calendar클래스 만으로 날짜 데이터를 원하는 형식으로 다양하게 출력하는 것은 불편하고 복잡하다.
이를 SimpleDateFormat을 이용해 간단히 할 수 있다.
단, Date인스턴스만 format메서드에 사용될 수 있기 때문에 Calendar인스턴스를 Date인스턴스로 변환하는 과정이 필요하다.
-사용하는 방법(Date 인스턴스 -> 원하는 형식의 문자열)
- 원하는 출력형식의 패턴을 작성
- SimpleDateFormat인스턴스 생성
- 출력하고자 하는 Date인스턴스를 넣어 format(Date d)를 호출
Date today = new Date();
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
String result = df.format(today);
-parse메서드(특정 형식의 문자열 -> Date 인스턴스)
SimpleDateFormat의 parse(String source)는 문자열source를 날짜 Date인스턴스로 변환해주기 때문에 매우 유용하게 쓰일 수 있다.
예를 들어 사용자로부터 날짜 데이터를 문자열로 입력받을 때, 입력받은 문자열을 날짜로 인식하기 위해서는 substring메서드를 이용해 년,월,일을 뽑아내야 하는데 parse(String source)는 이러한 수고를 덜어준다.
-참고 패턴
Letter
|
설명
|
y
|
연
|
M
|
월
|
d
|
일
|
E
|
요일명
|
u
|
요일 (1 = 월요일, 2=화요일, ..., 7 = 일요일)
|
a
|
오전인지 오후인지
("AM" or "PM" / 한글환경이면 "오전" or "오후")
|
H
|
24시간 기준 시간 (0-23)
|
k
|
24시간 기준 시간 (1-24)
|
K
|
오전오후 구분없는 시간 (0-11)
|
h
|
오전오호 구분없는 시간 (1-12)
|
m
|
분
|
s
|
초
|
S
|
1/1000 초
|
z
|
타임존
|
ChoiceFormat
ChoiceFormat은 특정 범위에 속하는 값을 문자열로 변환해준다.
연속적 또는 불연속적인 범위의 값들을 처리하는 데 있어서 if문이나 switch문은 적절하지 못한 경우가 많다. 이럴 때 ChoiceFormat을 잘 사용하면 복잡하게 처리될 수밖에 없었던 코드를 간단하고 직관적으로 만들 수 있다.
예제1)
String[] grades = {"D", "C", "B", "A"};
int[] scores = {100, 95, 88, 70, 52, 60, 70};
ChoiceFormat form = new ChoiceFormat(limits, grades);
for(int i=0; i< scores.length; i++){
System.out.println(scores[i] + ":" + form.format(scores[i]));
}
다음 코드에서 두 개의 배열이 사용되었는데 하나는 범위의 경계값(limit)을 저장하는데 사용하였고, 또 하나는 범위에 포함된 값(grades)을 치환할 문자열을 저장하는데 사용되었다.
경계값은 double형으로 반드시 모두 오름차순으로 정렬되어 있어야 하며, 그렇지 않으면 IllegalArgumentException이 발생한다.
예제2)
String patterns = "60<D|70<C|80<B|90<A";
int scores[] = {91, 67, 72, 88, 98, 80};
ChoiceFormat cf = new ChoiceFormat(patterns);
for(int i=0; i< scores.length; i++){
System.out.println(scores[i] + ":" + cf.format(scores[i]));
}
이전 예제를 패턴을 사용하도록 변경한 것이다. 이처럼 배열 대신 패턴을 사용해서 보다 간결하게 처리할 수도 있다.
ChoiceFormat은 패턴으로 '#'와 '<' 두 가지를 제공한다.
'#' : 'limit#value'형태로 경계값을 범위에 포함
'<' : 'limat<value'형태로 경계값을 범위에 포함하지 않음
MessageFormat
MessageFormat은 데이터를 정해진 양식에 맞게 출력할 수 있도록 도와준다.
데이터가 들어갈 자리를 마련해 놓은 양식을 미리 작성하고 프로그램을 이용해서 다수의 데이터를 같은 양식으로 출력할 때 사용하면 좋다.
parse를 이용하면 지정된 양식에서 필요한 데이터만을 손쉽게 추출해 낼 수도 있다.
예제1)
String msg = "Name: {0} \nTel: {1} \nAge: {2} \nBirthday: {3}";
Object[] arguments = {"김개똥", "010-1234-5678", "23", "99.07.29"};
String result = MessageFormat.format(msg, arguments);
System.out.println(result);
msg에 '{숫자}'로 표시된 부분이 바로 데이터가 출력될 자리이다.
이 자리는 순차적일 필요는 없고 여러 번 반복해서 사용할 수도 있다. 여기에 사용되는 숫자는 배열처럼 인덱스가 0부터 시작하며 양식에 들어갈 데이터는 객체배열인 arguments에 지정되어 있음을 알 수 있다.
객체배열이기 때문에 String이외에도 다른 객체들이 지정될 수 있으며, 이 경우 보다 세부적인 옵션들이 사용될 수 있다.
예제2)
String[] data = {
"INSERT INTO CUST_INFO VALUE ('김개똥','010-1234-5678','23','990729');",
"INSERT INTO CUST_INFO VALUE ('양소똥','010-5678-1234','23','990524');",
};
String patterns = "INSERT INTO CUST_INFO VALUES ({0},{1},{2},{3});";
MessageFormat mf = new MessageFormat(patterns);
for(int i=0; i< data.length; i++) {
Object[] objs = mf.parse(data[i]);
for(int j=0; j< objs.length; j++){
System.out.print(objs[j] + ",");
}
System.out.println();
}
이전 예제에서는 데이터를 양식에 넣어서 출력했지만 이번에는 parse(String source)를 이용해서 출력된 데이터로부터 필요한 데이터만을 뽑아내는 방법이다.
'Java > 날짜와 시간 & 형식화' 카테고리의 다른 글
[Java] java.time패키지 - 코딩밥상 (0) | 2023.02.21 |
---|---|
[Java] Calendar와 Date 클래스 - 코딩밥상 (0) | 2023.02.20 |