본문 바로가기
Java의 정석/날짜와 시간 & 형식화

날짜와 시간, Calendar 클래스

by Hwanii_ 2023. 9. 3.
728x90
ch10 - 1 ~ 3
날짜와 시간, Calendar 클래스

 

ch10 - 1
날짜와 시간

1. java.util.Date
- 날짜와 시간을 다룰 목적으로 만들어진 클래스. (JDK 1.0)
만들고 보니, 여러 단점이 발견 됬다.
- Date의 메서드는 거의 deprecated 되었지만, 여전히 사용 되고 있다.
deprecated : 중요도가 떨어져 더 이상 사용되지 않고 앞으로는 사라지게 되는 것을 의미. (컴퓨터 시스템 기능 등)

2. java.util.Calendar
- Date 클래스를 개선한 새로운 클래스. (JDK 1.1)
여전히 단점이 존재 했다.
단점이 있는데도 표준 클래스 였기 때문에, 오래전부터 최근까지 오랫동안 사용 되고 있다.

3. java.time 패키지
- Date와 Calendar의 단점을 개선한 새로운 클래스 제공 (JDK 1.8 == Java 8)

Date 클래스와 Calendar 클래스의 최고 단점은, 날짜와 시간을 함께 다뤄야 한다는 것이였다.

하지만,
time 패키지 에서는 날짜와 시간을 분리 해서 독립적으로 다룰 수 있게 됬다.
날짜 : LocalDate
시간 : LocalTime
날짜 + 시간 : LocalDateTime

암튼, 날짜와 시간은 프로그래밍에 있어서 중요한 데이터 타입 이다.

Calendar 클래스로 공부할 예정 이다.

 

ch10 - 2 Calendar 클래스

- 추상 클래스 이므로 getInstance() 를 통해 구현된 객체를 얻어야 한다.

Calendar cal = new Calendar             //  에러 ! (추상 클래스 이기 때문에 인스턴스화 불가능)

Calendar cal = Calendar.getInstance();  //  OK ! (getInstance() 메서드는 Calendar 클래스를 구현한 클래스의 인스턴스를 반환)

Calendar 종류는 다양 하다.
서양력 (그레고리력 : 우리나라는 서양력을 사용 한다)
불교력
일본력
..

getInstance() 메서드가 사용자 시스템의 정보를 읽어와서,
어떤 달력을 사용 하는지를 읽고,
그것에 맞는 인스턴스를 반환한다.

즉, 우리는 new GregorianCalendar() 객체를 반환 해준다.

class MyApplication {   //  안좋은 코드.

    public static void main(String main[]) {

        Calendar cal = new GregorianCalendar();
        ..
    }
}

위와 같이 달력 객체를 직접적으로 명시 하면, 경우에 따라 유지 보수가 불리해 질 수 있다.
(사용자가 다른 달력을 사용 한다던지 ..)

그래서,
getInstance() 메서드를 사용해서, 여러 달력 중에 하나를 골라서 줄 수 있도록,
상황에 맞는 객체를 반환 하도록 코드를 작성 하면 좋다.
즉, 추상화의 개념을 사용 한다.

 

ch10 - 3
Calendar 클래스 - 예제

 

예시 )

get() 메서드로 날짜와 시간 필드를 가져온다.
int get(int field)

Calendar cal = Calendar.getInstance();                      //  현재 날짜와 시간으로 세팅.
int thisYear = cal.get(Calendar.YEAR);                      //  올해가 몇년인지 알아내기.
int lastDayOfMonth = cal.getActualMaximum(Calendar.DATE)    //  이 달의 마지막 날 (DATE == 날짜)

 

[ 참고 ]

Calendar 에 정의된 필드

YEAR : 년
MONTH : 월 (0 부터 시작)
WEEK_OF_YEAR : 그 해의 몇 번째 주 (그 해의 1월 1일 부터 계산)
WEEK_OF_MONTH : 그 달의 몇 번째 주
DATE : 일
DAY_OF_MONTH : 그 달의 몇 번째 일
DAY_OF_YEAR : 그 해의 몇 번째 일 (그 해의 1월 1일 부터 계산)
DAY_OF_WEEK : 요일
DAY_OF_WEEK_IN_MONTH : 그 달의 몇 번째 요일

HOUR : 시간 (0 ~ 11)
HOUR_OF_DAY : 시간 (0 ~ 23)
MINUTE : 분
SECOND : 초
MILLISECOND : 천분의 일초
ZONE_OFFSET : GMT 기준 시차 (천분의 일초 단위) (TimeZone 시간대)
AM_PM : 오전 / 오후

 

Calendar 내부에,

get() 메서드를 사용하면,
객체의 필드값을 가져오고,

set() 메서드를 사용하면,
객체의 필드값 (== instance variable == 인스턴스 변수) 을 새롭게 set (변경) 한다.

 

import java.util.*;

class Ex10_1 {

    public static void main(String[] args) {  // 기본적으로 현재날짜와 시간으로 설정된다.

        Calendar today = Calendar.getInstance();
        System.out.println("이 해의 년도 : " + today.get(Calendar.YEAR));
        System.out.println("월(0 ~ 11, 0 : 1월) : " + today.get(Calendar.MONTH)); //  월은 1월 부터 시작이 아니라, 0월 부터 시작..
        System.out.println("이 해의 몇 째 주 : "
                + today.get(Calendar.WEEK_OF_YEAR));
        System.out.println("이 달의 몇 째 주 : "
                + today.get(Calendar.WEEK_OF_MONTH));
        // DATE와 DAY_OF_MONTH는 같다.
        System.out.println("이 달의 몇 일 : " + today.get(Calendar.DATE));
        System.out.println("이 달의 몇 일 : " + today.get(Calendar.DAY_OF_MONTH));
        System.out.println("이 해의 몇 일 : " + today.get(Calendar.DAY_OF_YEAR));
        System.out.println("요일(1 ~ 7, 1 : 일요일) : "
                + today.get(Calendar.DAY_OF_WEEK)); // 1:일요일, 2:월요일, ... 7:토요일
        System.out.println("이 달의 몇 째 요일 : "
                + today.get(Calendar.DAY_OF_WEEK_IN_MONTH));
        System.out.println("오전_오후(0 : 오전, 1 : 오후) : "
                + today.get(Calendar.AM_PM));
        System.out.println("시간 (0 ~ 11) : " + today.get(Calendar.HOUR));
        System.out.println("시간 (0 ~ 23) : " + today.get(Calendar.HOUR_OF_DAY));
        System.out.println("분 (0 ~ 59) : " + today.get(Calendar.MINUTE));
        System.out.println("초 (0 ~ 59) : " + today.get(Calendar.SECOND));
        System.out.println("1000분의 1초 (0 ~ 999) : "
                + today.get(Calendar.MILLISECOND));
        // 천분의 1초를 시간으로 표시하기 위해 3600000으로 나누었다.(1시간 = 60 * 60초)
        System.out.println("TimeZone (-12 ~ +12) : "
                + (today.get(Calendar.ZONE_OFFSET) / (60 * 60 * 1000)));
        System.out.println("이 달의 마지막 날 : "
                + today.getActualMaximum(Calendar.DATE)); // getActualMaximum(Calendar.DATE) : 이 달의 마지막 일.

    }

}

 

[ console ]

 

 

 

반응형