Date와 Calender간의 변화
Calender가 새로 추가되면서 Date는 대부분의 메서드가 'deprecated'되었으므로 잘 사용되지 않는다. 그럼에도 불구하고 Date를 필요로 하는 메서드들이 있기 때문에 Calender를 Date로 또는 그 반대로 변환할 일이 생긴다.
// Calendar를 Date로 변환
Calender cal = Calender.getInstance();
Date d = new Date(cal.getTimeInMillis()); // Date(long date)
// Date를 Calendar로 변환
Date d = new Date();
Calender cal = Calender.getInstance();
cal.setTime(d)
getInstance()를 통해 얻은 인스턴스는 기본적으로 현재 시스템의 날짜와 시간에 대한 정보를 담고있다.
자주 쓰이는 상수들
get메소드를 이용한 날짜 출력 예제
Calendar cal = Calendar.getInstance(); // getInstance()로 객체 생성
System.out.println("현재 날짜, 시간 : " + cal.getTime());
System.out.println("현재 날짜 : " + cal.get(Calendar.YEAR) + "년 " + (cal.get(Calendar.MONTH) + 1) + "월 " + cal.get(Calendar.DAY_OF_MONTH) + "일");
System.out.println(cal.get(Calendar.DAY_OF_WEEK)); // 요일 숫자 표시 (1은 일요일)
System.out.println(cal.get(Calendar.DAY_OF_YEAR)); // 일년중 몇 번째 날
System.out.println(cal.get(Calendar.HOUR_OF_DAY) + ":" + cal.get(Calendar.MINUTE) + ":" + cal.get(Calendar.SECOND) + ":" + cal.get(Calendar.MILLISECOND)); // 현재 시간 (24시간 단위 밀리초 포함)
System.out.println(cal.get(Calendar.HOUR) + ":" + cal.get(Calendar.MINUTE) + ":" + cal.get(Calendar.SECOND)); // 현재 시간 (12시간 단위 밀리초 미포함)
System.out.println(cal.get(Calendar.WEEK_OF_YEAR)); // 1년중 몇 번째 주)
결과
get메서드의 매개변수로 사용되는 int값들은 Calender에 정의된 static상수 이다.
set메소드를 이용한 날짜 수정 예제
Calendar cal = Calendar.getInstance(); // getInstance()로 객체 생성
System.out.println(cal.getTime());
cal.set(2021, Calendar.DECEMBER, 25, 23, 00, 00);
// 년 월 일 시 분 초
System.out.println(
cal.get(Calendar.YEAR) + "년 " +
(cal.get(Calendar.MONTH) + 1) + "월 " +
cal.get(Calendar.DATE) + "일 " +
cal.get(Calendar.HOUR_OF_DAY) + "시 " +
cal.get(Calendar.MINUTE) + "분 " +
cal.get(Calendar.SECOND) + "초");
결과
java.text패키지에 포함되어 있으며 숫자, 날짜, 텍스트 데이터를 일정한 형식에 맞게 표현할 수 있는 방법을 객체지향적으로 설계하여 표준화 하였다.
DecimalFormat
자주 사용되는 패턴
사용 방법
double number = 1234567.89; DecimalFormat df = new DecimalFormat("#.#E0"); String result = df.format(number);
DecimalFormat을 인스턴스화 해준 후 출력하고자 하는 문자열로 format메서드를 호출한다.
예제
DecimalFormat df = new DecimalFormat("0");
System.out.println(df.format(12345.6789));
df = new DecimalFormat("0,00.000");
System.out.println(df.format(12345.6789));
결과
12346
1,23,45.679
첫 줄의 출력값은 출력형식 패턴에 소수점을 넣어주지 않아서 0.6이 반올림 되어 12346이 출력이 되었다.
두번째 줄의 출력은 패턴에 단위구분자를 넣고 소수점 3번째 자리까지 출력으로 설정을해서 4번째자리가 반올림 되어 .679가 나온것을 볼 수 있다.
SimpleDateFormat
날짜 데이터를 간편하게 출력할 수 있게 해준다.
예제
Date today = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS a E요일");
System.out.println(sdf.format(today));
결과
Date 클래스를 인스턴스 후 내가 설정한 패턴에 맞게 날짜를 출력해준다
ChoiceFormat
특정 범위에 속하는 값을 문자열로 변환해 준다. 연속적 또는 불연속적인 범위 값들을 처리하는 데 있어서 if문과 switch문은 적절하지 못한 경우가 많다. 이럴 경우에 이 클래스를 사용한다.
예제
public static void main(String[] args) {
double[] limits = {60, 70, 80, 90};
// 낮은 값부터 큰 값의 순서대로 적어야 한다
// limits, grades 간의 순서와 개수를 맞춰야 한다.
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] + ":" + from.format(scores[i]));
}
}
결과
100:A
95:B
88:B
70:C
52:D
60:D
70:C
두 개의 배열이 사용되었는데 하나(limits)는 범위의 경계값을 저장하였고 또 하나(grades)는 범위에 포함된 값을 치환할 문자열을 저장하는데 사용되었다.
경계값은 double형으로 반드시 모두 오름차순으로 정렬되어 있어야 하며, 치환 될 문자열의 개수는 경계값에 의해 정의된 범위의 개수가 일치해야 한다. 그렇지 않으면 IllegalArgumentException이 발생한다.
MessageFormat
데이터를 양식에 맞게 출력할 수 있도록 도아준다. 데이터가 들어갈 자리를 마련해 놓은 양식을 미리 작성하고 프로그램을 이용해서 다수의 데이터를 같은 양식으로 출력할 때 사용하면 좋다.
예제
public static void main(String[] args) {
String msg = "Name : {0} \nTel : {1} \nAge : {2} \nBirthday : {3}";
Object[] arguments = {
"이자바", "02-123-1234", "27", "07-09"
};
String result = MessageFormat.format(msg, arguments);
System.out.println(result);
}
결과
Name : 이자바
Tel : 02-123-1234
Age : 27
Birthday : 07-09
msg변수를 작성할 때 {숫자}로 표시된 부분이 데이터가 출력될 자리이다. 이 자리는 순차적일 필요는 없고 여러 번 반복해서 사용할 수도 있다.
여기에 사용되는 숫자는 배열처럼 인덱스가 0부터 시작하며 양식에 들어갈 데이터는 객체배열인 arguments에 지정되어 있음을 알 수 있다.