[김영한의 실전 자바 중급편1] - java.time

jkky98·2024년 5월 18일
0

Java

목록 보기
18/51

time 라이브러리의 필요성

특정 날짜에서 다른 날짜까지의 정확한 일수를 계산하는 것은 생각보다 복잡하다. 윤년, 각 달의 일수 등 단순히 "1시간은 60분"이라는 규칙만이 적용되는 것이 아니라, 여러 조건들이 영향을 미친다.

예를 들어, 대한민국은 1988년 이후로 썸머타임(일광 절약 시간)을 적용하지 않지만, 썸머타임을 시행하는 국가도 있다. 이로 인해 날짜와 시간 계산 시 1시간의 오차가 발생할 수 있다.

따라서, 날짜와 시간 관련 계산에서 발생할 수 있는 복잡한 상황을 처리하기 위해 time 라이브러리와 같은 도구를 사용하는 것이 필요하다. 이 라이브러리는 다양한 날짜 및 시간 계산을 정확하고 일관되게 처리할 수 있게 도와준다.

타임존

타임존은 UTC(협정 세계시)로부터의 시간 차이로 정의된다. 예를 들어, 한국은 Asia/Seoul 타임존을 가지고 있으며, 이는 UTC 기준으로 +09:00 시간을 갖는다.

타임존을 사용하면, 각 지역의 시간을 정확하게 정의하고 다른 지역의 시간과의 차이를 계산할 수 있다.

LocalDate, Time, DateTime

자바 time 라이브러리에 속한 날짜 및 시간 관련 클래스는 다음과 같다:

  • LocalDate: 연도, 월, 일을 다룰 수 있는 클래스이다.
  • LocalTime: 시, 분, 초를 다룰 수 있는 클래스이다.
  • LocalDateTime: 날짜와 시간을 모두 다룰 수 있는 클래스이다.

Local이 붙는 이유는 세계 시간대를 고려하지 않고, 특정 지역의 날짜와 시간만을 다루기 때문이다. 대부분의 국내 개발자들은 해외 서비스를 개발하는 경우가 드물기 때문에, Localxx 계열의 시간 라이브러리를 비중 있게 사용한다.

한편, Instant는 초와 나노초 단위의 데이터를 다루며, UTC 기준으로 1970년 1월 1일부터 경과한 시간을 계산한다.

Epoch Time

에포크 시간(Epoch Time) 또는 유닉스 타임스탬프는 컴퓨터 시스템에서 시간을 나타내는 방법이다. 이는 Instant처럼 1970년 1월 1일을 기준으로 경과된 시간을 초 단위로 표현한다.
"Epoch"라는 용어 자체는 중요한 사건이 발생한 시점을 기준으로 삼는 시작점을 의미한다. 에포크 시간을 사용하면, 사용자 친화적이지는 않지만, 각 국가마다 다른 시간 규칙을 피할 수 있어 시간적 독립성을 가질 수 있다. 이는 시간대나 썸머타임 등의 영향을 받지 않고 일관된 시간 계산을 제공한다.

시간 활용을 위한 개념

특정 시점의 시간과 시간 간격으로 나누어 생각하면 편리하다. 시간 간격은 크게 PeriodDuration으로 나눌 수 있다:

  • Period: 날짜 사이의 간격을 나타내는 클래스이다. 예를 들어, 일, 월, 년 단위로 간격을 표현할 때 사용된다.
  • Duration: 시간 사이의 간격을 나타내는 클래스이다. 초, 밀리초, 나노초와 같은 시간 단위로 간격을 표현할 때 사용된다.

이렇게 PeriodDuration을 구분하여 사용하면, 날짜와 시간을 더 명확하고 직관적으로 다룰 수 있다.

Method

주의! 모든 날짜, 시간 클래스는 불변이다 => 반환값을 꼭 받자.

  • of() : 특정 날짜나 시간을 생성한다.
  • now() : 현재 날짜나 시간을 생성한다.
  • plusXxx() : Xxx에는 Years, Months, Hours...이 존재한다. 더하는 기능.
  • isBefore() , isAfter() : 다른 날짜시간을 비교한다. 현재 날짜와 시간이 이전이나 이후면 true를 반환한다.
  • isEqueal() : 자바의 equals()는 시간 비교 시 객체의 타입, 타임존 등등 내부 데이터의 구성요소가 같아야 참을 리턴하지만 isEqueal()은 시간적으로 같으면 참이다.
  • Period or Duration .between(시작, 끝) : 시작 날짜시간, 끝날짜시간을 인자로 넣어주면 날짜시간간격 객체를 반환해준다.
  • withXxx() : 날짜시간을 조작(예 : 특정 시간만 바꾸기, 같은 달의 마지막 금요일로 가기(TemporalAdjuster사용) 등등)
  • get() : 시간 객체에서 특정 필드들 가져오기

get vs of

get은 주로 행위변화를 나타내며, 어떤 대상을 취하거나 얻는 동작을 표현한다. 예를 들어, "he got a computer"는 "그는 컴퓨터를 얻었다"로 해석되며, 이는 그가 컴퓨터를 취해서 자신의 상태가 변화한 것을 의미한다. 반면, of는 주로 소속, 부분, 속성을 나타내는 전치사로 사용되며, 예를 들어 "the color of the car"는 "차의 색"을 의미하고, 이는 소속이나 부분을 나타낸다. 따라서 get은 동작이나 변화에 초점을 맞춘 반면, of는 관계나 속성을 강조하는 차이가 있다.

  • he is sick , he got sick : 두 표현모두 그가 아프다는 것이지만 "느낌"에서는 is sick은 단순한 사실전달이며 got sick은 "어떠한 이유에 의해 아프게 되었다" got sick에서 sick에 의해 he는 영향을 받는 객체의 느낌이다.

프로그래밍에서

get은 어떠한 객체에서 원하는 것을 가져오는 기능이며 원어민적 느낌으로, 그 원하는 것은 객체에 속해있는데, 그것의 상태변화를 일으킨다는 느낌이다.
반면 of은 "생성"의 느낌이 들어간다고 보면 된다. 누군가가 가진 것중 하나를 가져오는 것이 아닌 create의 느낌에 조금 더 치중되어있다.


Chrono Field, Unit

크로노 필드는 날짜와 시간의 특정한 구성 요소를 나타낸다. 예를 들어, , , , 와 같은 요소들이 크로노 필드에 해당한다. 반면, 크로노 유닛시간 단위를 나타낸다.

크로노 필드TemporalField 인터페이스를 구현하며, 크로노 유닛TemporalUnit을 구현한다. 이들 모두 열거형(Enum)으로 제공된다.

정리

시간 라이브러리는 사용법을 다 외우기보단 어떠한 기능들이 가능하다는 것만 기억하고 기억나지 않는다면 검색 등을 통해 해결하도록 하자.

profile
자바집사의 거북이 수련법

0개의 댓글