형식화 클래스

ppp·2025년 6월 24일

Java 공부

목록 보기
7/13
post-thumbnail

Java 애플리케이션에서는 사용자에게 데이터를 보여줄 때, 숫자나 날짜, 통화 등 다양한 형식으로 데이터를 표현하는 경우가 많습니다. 이러한 데이터 표현의 일관성과 유연성을 위해 Java에서는 java.text 패키지를 통해 형식화(formatting) 클래스를 제공합니다.

형식화 클래스는 데이터를 패턴 기반의 형식 문자열로 변환하는 기능뿐만 아니라, 형식화된 문자열로부터 원래의 데이터 객체를 복원하는 기능도 함께 제공합니다. 이는 단순한 변환을 넘어 입출력 양방향에 걸쳐 신뢰성 있는 데이터 처리를 가능하게 해주며, 객체지향적으로 잘 설계된 API 덕분에 다양한 상황에 유연하게 대응할 수 있습니다.


DecimalFormat

Java에서 숫자를 일정한 형식으로 표현하거나, 형식화된 문자열을 다시 숫자로 되돌리고자 할 때 가장 유용하게 사용할 수 있는 클래스가 바로 DecimalFormat입니다. 이 클래스는 java.text.NumberFormat의 하위 클래스이며, 정수, 소수, 통화, 퍼센트, 지수 표기 등 다양한 숫자 표현을 패턴 기반으로 처리할 수 있는 기능을 제공합니다.

DecimalFormat의 기본 개념

DecimalFormat은 문자열 패턴을 통해 숫자의 출력 형식을 지정합니다. 예를 들어 "#,###.##" 와 같은 패턴은 숫자를 천 단위 구분자(,)와 소수점 둘째 자리까지 표현하도록 지정합니다. 또한 문자열에 포함된 숫자 형식에서 원래의 Number 객체로 복원할 수 있는 역변환(parse) 기능도 지원합니다.

패턴 기호 정리

아래 표는 DecimalFormat에서 사용되는 주요 패턴 기호와 예시를 정리한 것입니다.

기호의미예시 패턴결과 (입력값: 1234567.89)
010진수 (빈 자리는 0으로 채움)0000000000.00000001234567.8900
#10진수 (빈 자리는 표시 안함)##########.####1234567.89
.소수점 구분자#.#1234567.9
-음수 기호-#.#-1234567.9
,천 단위 구분자#,###.##1,234,567.89
E지수 표기#.#E01.2E6
;양수/음수 패턴 구분#,###.##+;#,###.##-1,234,567.89+ 또는 1,234,567.89-
%퍼센트 (100을 곱함)#.#%123456789%
\u2030퍼밀 (1000을 곱함)#.#\u20301234567890‰
\u00A4통화 기호`\u00A4 #,###₩ 1,234,568
'특수 문자 escape'#'#,####1,234,568

기본 사용 예제

아래는 DecimalFormat을 사용하여 숫자를 지수 표기로 변환하는 간단한 예시입니다.

double number = 1234567.89;
DecimalFormat df = new DecimalFormat("#.#E0");
String result = df.format(number);
System.out.println(result); // 1.2E6

문자열을 숫자로 역변환 (parse)

parse(String source)는 DecimalFormat의 조상인 NumberFormat에 정의된 메서드입니다.

public Number parse(String source) throws ParseException

이 메서드는 형식화된 텍스트를 Number 객체로 변환하며, 필요에 따라 intValue(), doubleValue() 등으로 구체적인 타입으로 꺼낼 수 있습니다.

import java.text.*;

class Ex10_7 {
	public static void main(String[] args) {
		DecimalFormat df  = new DecimalFormat("#,###.##");
		DecimalFormat df2 = new DecimalFormat("#.###E0");

		try {
			Number num = df.parse("1,234,567.89");
			System.out.print("1,234,567.89" + " -> ");

			double d = num.doubleValue(); 
			System.out.print(d + " -> ");

			System.out.println(df2.format(num));
		} catch(Exception e) {}
	}
}

// 1,234,567.89 -> 1234567.89 -> 1.235E6

SimpleDateFormat

날짜와 시간은 다양한 형식으로 출력되어야 하는 데이터 중 하나입니다. 사용자의 로케일, 시스템 설정, 표현 목적에 따라 “2025-06-24”, “2025년 6월 24일”, “June 24, 2025” 등 매우 다양하게 표현되죠. 이러한 형식의 제어를 위해 Java에서는 java.text 패키지의 SimpleDateFormat 클래스를 제공합니다.

이 클래스는 원하는 출력 형식을 문자열 패턴으로 정의하고, 이를 바탕으로 Date 객체를 문자열로 형식화(format) 하거나, 문자열을 다시 Date 객체로 파싱(parse) 하는 기능을 제공합니다.

날짜/시간 패턴 기호 정리

아래는 SimpleDateFormat에서 사용 가능한 주요 포맷 기호와 그 의미입니다.

기호의미보기
G연대(BC, AD)AD
y년도2006
M월(1~12 또는 1월 ~ 12월)10 또는 10월, OCT
w년의 몇 번째 주(1~53)50
W월의 몇 번째 주(1~5)4
D년의 몇 번째 일(1~366)100
d월의 몇 번째 일(1~31)15
F월의 몇 번째 요일(1~5)1
E요일
a오전/오후(AM, PM)PM
H시간(0~23)20
k시간(1~24)13
K시간(0~11)10
h시간(1~12)11
m분(0~59)35
s초(0~59)55
S천분의 일초(0~999)253
zTime zone(General time zone)GMT+9:00
ZTime zone(RFC 822 time zone)+0900
escape문자(특수문자를 표현하는데 사용)없음

날짜를 문자열로 변환 – format()

아래는 현재 날짜를 원하는 형식으로 출력하는 예시입니다.

import java.text.SimpleDateFormat;
import java.util.Date;

public class DateFormatExample {
    public static void main(String[] args) {
        Date today = new Date();
        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");

        String result = df.format(today);
        System.out.println(result);  // 2025-06-24
    }
}

여기서 "yyyy-MM-dd"는 4자리 연도-2자리 월-2자리 일의 형식을 지정하는 패턴입니다. "MM"을 "MMM" 또는 "MMMM"으로 바꾸면 각각 "6월", "June" 등으로 출력됩니다.

문자열을 날짜로 변환 – parse()

parse() 메서드를 사용하면 문자열을 Date 객체로 변환할 수 있습니다. 단, 입력 형식과 패턴이 정확히 일치해야 하며, 일치하지 않을 경우 ParseException이 발생하므로 예외 처리가 필요합니다.

import java.util.*;
import java.text.*;

class Ex10_9 {
	public static void main(String[] args) {
		DateFormat df  = new SimpleDateFormat("yyyy년 MM월 dd일");
		DateFormat df2 = new SimpleDateFormat("yyyy/MM/dd");

		try {
			Date d = df.parse("2019년 11월 23일");
			System.out.println(df2.format(d)); // 2019/11/23
		} catch(Exception e) {}
	}
}

0개의 댓글