Java 8에서의 Date/Time API

Bruce Han·2023년 2월 12일
0

Java8-정리

목록 보기
11/20
post-thumbnail
post-custom-banner

이 포스팅의 코드 및 정보들은 강의를 들으며 정리한 내용을 토대로 작성한 것입니다.

Java 8부터 날짜와 시간 API 생긴 이유

datetime1

이 4개의 클래스들은 date와 관련된 라이브러리들이다.

https://codeblog.jonskeet.uk/2017/04/23/all-about-java-util-date/

하지만, 위와 같은 포스팅 내용에 따라 불편한 점들이 많았다.

대표적인 이유로

1. 클래스 작명이 잘 되어있지는 않았다.

  • Date 클래스이지만 시간까지도 나타낼 수 있고, TimeStamp도 표현할 수 있다.
Date date = new Date();
long time = date.getTime();

날짜 클래스에서 시간을 가져오는 것은 이상하다. 그런데 이 long 타입의 time은 Epoch Time을 리턴하는 것이다.

datetime2

date는 지금의 날짜, 일시가 출력되고, time은 1970년 1월 1일부터 지금까지 흐른 millisecond가 출력됐다.

2. 그 전에 사용됐던 java.util.Date 클래스는 mutable하기 때문에, thread safe하지 않다.

datetime3

시간을 임의로 변경도 가능하므로, 즉 객체의 상태를 바꿀 수 있으므로 mutable하며, 이는 multi thread 내에서는 안전하지 않음을 의미한다.

3. 버그가 발생할 여지가 많다

datetime4

예를 들어, 설날을 구하고자 그레고리언 클래스를 이용하려고 하면 숫자로 0도 들어갈 수 있기 때문에, Constant variable을 쓰라고 IDE에서도 권장해준다.

datetime5

이런 식으로 type safe하지 않기 때문에 아무 값이나 넣는 등 실수할 가능성이 높다. 그래서 타입을 확실하게 정해주도록 파라미터 타입으로 Enum만 받을 수 있게 한다던지 등의 조치가 필요했다.

datetime6

설날을 이렇게 임의로 바꾸게 되면 위험하다(mutable하다).

4. 날짜 시간 처리가 복잡한 애플리케이션에서는 보통 Joda Time을 쓰곤 했다.

많은 개발자들이 시간과 관련된 기능이 제공되는 라이브러리인 Joda Time을 많이 쓰다보니, JSR-310 스팩을 표준화하면서 Joda Time을 사용할 수있도록 스탠다드 라이브러리에 들어오게 된 것이다.

Java 8에서 제공하는 Date-Time API

그렇게 Joda Time이 java.Time패키지 안으로 들어오게 된다. 이 패키지로 들어오면서 4가지의 철학(원칙)이 정의되었다.

date와 Time 관련된 라이브러리들은 다음 4가지의 특징을 가져야 한다.

Clear

API들이 명확해야 한다.
예) Date인데 time을 꺼내거나, epoch time이 나오는 등 사람에게 친숙한 타입의 시간이 나오면 안 된다.

Immutable

datetime7

이렇게 설날의 날짜를 바꿀 수 있는 것은 옳지 못하다.

immutable하다는 것은 기존의 인스턴스가 바뀌는 것이 아니라 새로운 인스턴스가 나올 것이다.

LocalDate dateOfBirth = LocalDate.of(2012, Month.MAY, 14);
LocalDate firstBirthday = dateOfBirth.plusYears(1);

위 소스처럼 기존의 날짜에서 더하면 새로운 인스턴스가 나와야 한다.

Fluent

LocalDate today = LocalDate.now();
LocalDate payday = today.with(TemporalAdjusters.lastDayOfMonth()).minusDays(2);

null을 리턴하거나 받는 게 없기 때문에 계속해서 메서드를 이어갈 수 있다. 즉, API 자체가 좀 더 유려해진다는 것이다.

Extensible

예시에서 든 그레고리안 캘린더 말고도

datetime8

이런 특이한 달력 체계들을 지원해주거나 본인이 직접 달력 시스템을 만든 것을 활용할 수 있게 해준다. 이런 확장성이 있어야 한다.

주요 API

DateTimeFormatter를 사용해서 일시를 특정한 문자열로 formatting할 수 있다.

사람용 시간

우리가 흔히 사용하는 연, 월, 일, 시, 분, 초 등을 표현하며, 기간을 표현할 때는 Duration(시간 기반)과 Period(날짜 기반)을 사용할 수 있다.
특정 날짜(LocalDate), 시간(LocalTime), 일시(LocalDateTime)을 사용할 수 있다.

기계용 시간

datetime10
기계용 시간은 EPOCH (1970년 1월 1일)부터 현재까지의 timestamp를 표현하며, timestamp는 Instant를 사용한다.

Reference

profile
만 가지 발차기를 한 번씩 연습하는 사람은 두렵지 않다. 내가 두려워 하는 사람은 한 가지 발차기를 만 번씩 연습하는 사람이다. - Bruce Lee
post-custom-banner

0개의 댓글