이 포스팅의 코드 및 정보들은 강의를 들으며 정리한 내용을 토대로 작성한 것입니다.
이 4개의 클래스들은 date와 관련된 라이브러리들이다.
https://codeblog.jonskeet.uk/2017/04/23/all-about-java-util-date/
하지만, 위와 같은 포스팅 내용에 따라 불편한 점들이 많았다.
대표적인 이유로
Date date = new Date();
long time = date.getTime();
날짜 클래스에서 시간을 가져오는 것은 이상하다. 그런데 이 long 타입의 time은 Epoch Time을 리턴하는 것이다.
date는 지금의 날짜, 일시가 출력되고, time은 1970년 1월 1일부터 지금까지 흐른 millisecond가 출력됐다.
시간을 임의로 변경도 가능하므로, 즉 객체의 상태를 바꿀 수 있으므로 mutable하며, 이는 multi thread 내에서는 안전하지 않음을 의미한다.
예를 들어, 설날을 구하고자 그레고리언 클래스를 이용하려고 하면 숫자로 0도 들어갈 수 있기 때문에, Constant variable을 쓰라고 IDE에서도 권장해준다.
이런 식으로 type safe하지 않기 때문에 아무 값이나 넣는 등 실수할 가능성이 높다. 그래서 타입을 확실하게 정해주도록 파라미터 타입으로 Enum만 받을 수 있게 한다던지 등의 조치가 필요했다.
설날을 이렇게 임의로 바꾸게 되면 위험하다(mutable하다).
많은 개발자들이 시간과 관련된 기능이 제공되는 라이브러리인 Joda Time을 많이 쓰다보니, JSR-310 스팩을 표준화하면서 Joda Time을 사용할 수있도록 스탠다드 라이브러리에 들어오게 된 것이다.
그렇게 Joda Time이 java.Time패키지 안으로 들어오게 된다. 이 패키지로 들어오면서 4가지의 철학(원칙)이 정의되었다.
date와 Time 관련된 라이브러리들은 다음 4가지의 특징을 가져야 한다.
API들이 명확해야 한다.
예) Date인데 time을 꺼내거나, epoch time이 나오는 등 사람에게 친숙한 타입의 시간이 나오면 안 된다.
이렇게 설날의 날짜를 바꿀 수 있는 것은 옳지 못하다.
immutable하다는 것은 기존의 인스턴스가 바뀌는 것이 아니라 새로운 인스턴스가 나올 것이다.
LocalDate dateOfBirth = LocalDate.of(2012, Month.MAY, 14);
LocalDate firstBirthday = dateOfBirth.plusYears(1);
위 소스처럼 기존의 날짜에서 더하면 새로운 인스턴스가 나와야 한다.
LocalDate today = LocalDate.now();
LocalDate payday = today.with(TemporalAdjusters.lastDayOfMonth()).minusDays(2);
null을 리턴하거나 받는 게 없기 때문에 계속해서 메서드를 이어갈 수 있다. 즉, API 자체가 좀 더 유려해진다는 것이다.
예시에서 든 그레고리안 캘린더 말고도
이런 특이한 달력 체계들을 지원해주거나 본인이 직접 달력 시스템을 만든 것을 활용할 수 있게 해준다. 이런 확장성이 있어야 한다.
DateTimeFormatter를 사용해서 일시를 특정한 문자열로 formatting할 수 있다.
우리가 흔히 사용하는 연, 월, 일, 시, 분, 초 등을 표현하며, 기간을 표현할 때는 Duration(시간 기반)과 Period(날짜 기반)을 사용할 수 있다.
특정 날짜(LocalDate), 시간(LocalTime), 일시(LocalDateTime)을 사용할 수 있다.
기계용 시간은 EPOCH (1970년 1월 1일)부터 현재까지의 timestamp를 표현하며, timestamp는 Instant를 사용한다.