LocalDateTime (미 정재 .ver)
- 프로그래밍 언어/자바
- 2021. 9. 4. 01:40
LocalDateTime은 LocalDate와 LocalTime두 개를 합친 클래스입니다.
이들은 모두 java 8에 처음 등장하였습니다.
그런데 이상합니다.
자바 릴리즈 노트에 따르면
2014-03-18 | Major | 8 LTS | Documentation, JSR 337, Configurations |
자바 8은 2014년 3월에 출시되었음을 알 수 있습니다.
이게 왜 이상한 이유는 LocalDateTime은 시간과 관련된 클래스입니다.
그런데 엔터프라이즈 어플리케이션을 만드는 언어가 시간과 관련된 클래스가 없었다는 것은 말이 되지 않습니다.
사실 자바에는 시간과 관련된 클래스를 제공하고 있었습니다.
바로 Calender와 Date가 그 주인공들입니다.
그러면 어째서 자바는 시간과 관련된 클래스를 다시 만든 이유가 무엇일까요?
여러 이유가 있겠지만 쓰레드환경에 안전하지 않는다고 합니다.
일단 javadoc을 살펴보겠습니다.
ISO-8601 달력 시스템에서 표준 시간대가 없는 날짜-시간(예: 2007-12-03T10:15:30.
LocalDateTime날짜-시간을 나타내는 변경할 수 없는 날짜-시간 개체로, 종종 년-월-일-시-분-초로 표시됩니다.
그렇다고 합니다.
어디 한번 확인 해보죠.
System.out.println(LocalDateTime.now());
근데 ISO-8601 달력 시스템
이건 또 뭘까요?
Data elements and interchange formats - Information interchange - Representation of dates and times은 날짜와 시간과 관련된 데이터 교환을 다루는 국제 표준이다. 이 표준은 국제 표준화 기구(ISO)에 의해 공포되었으며 1988년에 처음으로 공개되었다.
https://ko.wikipedia.org/wiki/ISO_8601
이 클래스는 표준 시간대를 저장하거나 나타내지 않습니다.
docs를 읽으면서 새롭게 안 사실은
과거 응용프로램은 ISO-8601에 적용하지 않았다는 사실을 알 수 있습니다.
이것은 value-based 클래스입니다.
value-based???
이것은 조금더 공부할 필요가 있을 것 같아 이거는 링크만 올려두고 계속해서 LocalDateTime에 대해 설멸하겠습니다.
다음 코드를 확인해겠습니다.
LocalDateTime now = LocalDateTime.now();
System.out.println(now.hashCode());
now = LocalDateTime.of(2022, 10, 20, 20, 10);
System.out.println(now.hashCode());
now = LocalDateTime.of(2022, 11, 20, 20, 10);
System.out.println(now.hashCode());
final이 붙었다는 이야기는
이 클래스를 계속 호출을 하게되면 클래스를 새로 만들어야 된다는 이야기가 됩니다.
그러면 위 모두 hashcode가 달라야 됩니다. 왜냐하면 새로운 클래스를 호출되었기 때문입니다.
만약 같은 클래스라면 계속 같은 클래스가 나와야 겠죠.
만약에 같은 클래스를 무조건 나오게 하는 방법은 싱글톤 방법이 있을 것 같지만,
하기 귀찮기도 하구 기타 등등 이유때문에 안합니다.
아무튼 공식 docs에도 This class is immutable and thread-safe.라고 나와있습니다.
이것으로 봐서 쓰레드 세이프 하다는 게 알 수 있는데 지금 당장은 잘 모르겠네여.