날짜와 시간, Calendar 클래스
날짜와 시간
- java.util.Date
- 날짜와 시간을 다룰 목적으로 만들어진 클래스(JDK1.0)
- Date의 메서드는 거의 deprecated되었지만, 여전히 쓰이고 있다.
java.util.Date는 날자와 시간을 다룰 목적으로 만들어진 클래스다.
자바 초기에 만들어져서 미흡한 부분이 많이 있다.
그래서 Date 메서드는 거의 Depreacated(앞으로 사용하지 말것을 권장)하지만, 여전히 쓰이고 있다.
- java.util.Calendar
- Date클래스를 개선한 새로운 클래스(JDK1.1). 여전히 단점이 존재
Date클래스를 개선해서 Calendar라는 클래스가 새로 추가되었다. 그러나 여전히 단점이 존재했다.
- java.time패키지
- Date와 Calendar의 단점을 개선한 새로운 클래스들을 제공(JDK1.8(Java 8))
JDK8에 기존의 Date와 Calendar클래스의 단점을 개선한 새로운 클래스들을 제공하는
java.time패키지가 제공되었다.
Date와 Calendar는 항상 날짜와 시간을 같이 다루는 것이 문제였다.
그러나, java.time패키지에서는 날짜와 시간을 따로 다룰 수 있도록,
LocalDate, LocaTime, 혹은 합쳐서 다룰 때는, LocaDateTime 이렇게 클래스를 나눠놓았다.
Calendar 클래스
- 추상 클래스이므로 getInstance()를 통해 구현된 객체를 얻어야 한다.
Calendar클래스는 추상클래스라서 인스턴스(객체)를 생성할 수 없다.
그래서 Calendar cal = new Calendar(); 이렇게 하면 에러가 발생한다.
그래서 객체를 만들때는, getInstance()메서드를 호출해야 한다.
그러면, getInstance() 메서드가 Calendar클래스를 구현한 클래스의 객체를 반환한다.
Calendar종류에는 여러개가 있다.
서양력
불교력
일본력
이 있다.
getInstance()메서드가 사용자 시스템이 있는 정보를 읽어와서 어떤 캘린더를 사용하는지를 판단해서,
위의 세가지 중에서 한가지를 참조변수 cal에 반환해 주는 것이다.
우리나라는 서양력을 쓰므로,
Calendar cal = Calendar.getInstance(); 코드가
new GregoryanCalendar() 이 객체를 만들어서 반환해준다.
이 것을 보고, "그러면, 직접 new GregoryanCalendar() 이렇게 쓰지 왜 getInstace()를 사용하나요?" 라는 의문이 든다면,
추상화에 대해서 다시 공부를 해보길 바란다.
달력이 여러개가 있어서 이중에서 하나를 골라서 줘야하는데,
new GregorianCalendar()처럼 특정 캘린더를 고정해놓으면,
사용자가 다른 달력을 사용해야 할 때, 해당 코드를 다른 달력의 객체로 수정해야 한다.
그런데, 코드를 Calendar cal = Calendar.getInstance(); 이렇게 메서드를 통해서 얻도록 작성해 놓으면,
getInstance()라는 메서드는 변경을 해야겠지만,
getInstance()를 사용하는 쪽은 변경하지 않아도 된다.
그래서, new GregoryanCalendar() 처럼 직접 사용할 클래스를 지정해 주는 것보다,
Calendar cal = Calendar.getInstance();처럼 메서드를 통해서 상황에 맞는 객체를 반환하도록 작성하는게
더 좋은 코드이고, 이것을 추상화라고 한다.
- get()으로 날짜와 시간 필드 가져오기 - int get(int field)
get() 메서드는 Calendar객체가 가지고 있는 날짜와 시간을 가지고 올 수 있다 .
[예제 1]
코드를 보면, 처음에 캘린더 객체를 생성한다.
그런데, 처음에 캘린더 객체가 생성이 되면, 이 캘린더 객체는 현재 날짜와 시간으로 세팅된다.
그리고 거기서 get(Calendar.YEAR)를 넣어주면 현재 날짜와 시간에서 연도를 얻어서 반환한다.
그래서 int thisYear = cal.get(Calendar.YEAR)를 통해 올해가 몇년인지 알아낼 수 있다.
그리고, getActualMaximum(Calendar.DATE)이라는 메서드도 있는데,
이 메서드에 DATE를 넣어주면, 해당 날짜의 달에 있는 마지막 날(말일)을 알려준다.
그리고, Calendar.YEAR, Calendar.DATE 처럼 사용할 수 있는 필드들은 표에 있는 필드들을 사용할 수 있다.
만약, Calendar객체에 있는 날짜가 몇월인지 알아내고 싶으면,
cal.get(Calendar.MONTH)를 사용하면 되는데, MONTH필드를 사용할 때 주의할 점은, 반환되는 월이 0부터 시작한다는점을 주의해야 한다. 그래서 만약, 값이 7이 나오면 8월, 0이나오면 1월을 의미한다.
WEEK_OF_YEAR는 그해의 시작인 1월 1일부터 지금까지가 몇번째주인지를 알 수 있는 필드이다.
WEEK_OF_MONTH는 그 달의 몇 번째 주인지를 알 수 있는 필드이다.
시간필드에서 ZONE_OFFSET은 GMT기준 시차인데, 한국은 GMT기준으로 +9이다.
'JAVA' 카테고리의 다른 글
Calendar 예제(2) (0) | 2022.04.26 |
---|---|
Calendar 예제(1) (0) | 2022.04.25 |
오토박싱 & 언박싱, 문자열과 숫자변환 (0) | 2022.04.19 |
래퍼 클래스, Number 클래스 (0) | 2022.04.18 |
StringBuilder, Math 클래스 (0) | 2022.04.17 |
댓글
이 글 공유하기
다른 글
-
Calendar 예제(2)
Calendar 예제(2)
2022.04.26 -
Calendar 예제(1)
Calendar 예제(1)
2022.04.25 -
오토박싱 & 언박싱, 문자열과 숫자변환
오토박싱 & 언박싱, 문자열과 숫자변환
2022.04.19 -
래퍼 클래스, Number 클래스
래퍼 클래스, Number 클래스
2022.04.18