반응형
자바 8에 새로운 날짜와 시간 API가 생긴 이유
- 그전까지 사용하던 java.util.Date 클래스는 mutable 하기 때문에 thread safe 하지 않다.
- 클래스 이름이 명확하지 않다.
- Date인데 시간까지 다루고 있다.
- 버그 발생할 여지가 많다.
- 타입 안정성(type safe)이 없고, 1월이 0부터 시작하여 사용자가 실수할 여지가 있다.
- 자바8 이전의 표준 날짜 및 시간 클래스의 문제로 날짜 시간 처리가 복잡한 애플리케이션에서는 보통 Joda Time을 쓰곤했다.
자바 8에서 제공하는 Date-Time API
- JSR-310 스팩의 구현체를 제공한다.
- 디자인 철학
- Clear
- API의 메소드는 잘 정의되어 있으며 그 동작은 명확하고 예상되어야한다. 예를 들자면 null 매개 변수 값으로 Date-Time 메소드를 호출하면 일반적으로 NullPointerException이 트리거 된다. 또한 Date에서 time을 꺼낸다던지, time을 꺼냇는데 사람에게 친숙한 time이 아니라 기계용 time이라던지 이러한 불명확 한 것들이 없어야 한다.
- Fluent
- null을 입력으로 받거나 null을 리턴하지 않기 때문에 메서드 체이닝을 이어나갈 수 있다. 결과 코드를 신속하게 이해할 수 있다.
- Immutable
- 기존의 인스턴스가 바뀌는 것이 아니라 새로운 인스턴스를 생성하여 반환한다.
- thread safe 하다
- Extensible
- Date-Time API는 가능한 한 확장할 수 있다.
- 다른 여러 달력 시스템들을 사용할 수 있고 자신만의 캘린더 시스템을 구축할 수도 있다.
- Clear
주요 API 개념
- 기계용 시간 (machine time)과 인류용 시간(human time)으로 나눌 수 있다.
- 기계용 시간은 EPOCK (1970년 1월 1일 0시 0분 0초)부터 현재까지의 타임스탬프를 표현한다.
- 인류용 시간은 우리가 흔히 사용하는 연,월,일,시,분,초 등을 표현한다.
- 타임스탬프는 Instant를 사용한다.
- 특정 날짜(LocalDate), 시간(LocalTime), 일시(LocalDateTime)를 사용할 수 있다.
- 기간을 표현할 때는 Duration (시간 기반)과 Period (날짜 기반)를 사용할 수 있다.
- DateTimeFormatter를 사용해서 일시를 특정한 문자열로 포매팅할 수 있다.
기존 날짜와 시간 API 문제점
public class Main {
public static void main(String[] args) throws InterruptedException {
/*
기존의 클래스(Date, Calendar ...)는 객체의 상태를 바꿀수 있기(mutable) 때문에 thread safe하지 않다.
*/
Date date = new Date(); // 기계용 시간
long time = date.getTime();
System.out.println(date);
System.out.println(time);
Thread.sleep(1000 * 3); //3초
Date after3Seconds = new Date();
System.out.println(after3Seconds);
after3Seconds.setTime(time); //이전의 시간을 변경시킨다.
System.out.println(after3Seconds);
System.out.println("#######################");
/*
버그 발생 여지가 있다. 1월은 0부터 시작하기 때문에 실수할 여지가 있다.
또한 int형의 값은 아무 값이나 들어올 수 있기 때문에 type safe하지 않다. (달은 1월부터 12월인데 이것을 초과하거나 음수 값이 들어올 수 있다)
type safe해질려면 int로 받지말고 타입으로 값을 받아야한다. (달은 Month라는 타입으로 받으면 type safe 해진다)
*/
//Calendar birthDay = new GregorianCalendar(1993, 6, 24);
Calendar birthDay = new GregorianCalendar(1993, Calendar.JUNE, 24);
System.out.println(birthDay.getTime());
birthDay.add(Calendar.DAY_OF_YEAR, 1);
System.out.println(birthDay.getTime());
}
}
[참고자료]
반응형
'Java > 기본' 카테고리의 다른 글
자바 동시성(Java Concurrent) - 1 (Thread) (0) | 2021.07.02 |
---|---|
자바(Java) Date-Time API - 2 (Date-Time API 활용) (0) | 2021.07.01 |
자바(Java) Optional API - 2 (Optional API 활용) (0) | 2021.06.30 |
자바(Java) Optional API - 1 (Optional 개념 소개) (0) | 2021.06.27 |
자바 스트림(Java Stream) API - 2 (스트림 API 활용) (0) | 2021.06.27 |