[Java 응용] java.time 패키지 - 0. 개요(날짜 및 시간 관련 도구의 필요성)

Kyung Jae, Cheong·2024년 8월 29일
0
post-thumbnail

0. java.time 패키지 개요

  • Java의 java.time 패키지는 JDK 8부터 도입된 새로운 날짜와 시간 라이브러리로, 기존의 java.util.Datejava.util.Calendar의 문제점을 해결하기 위해 설계되었습니다.

java.time 패키지 포스팅 목차

  1. java.time 패키지 개요
  2. 주요 클래스 목록 및 용도별 분류
  3. 핵심 인터페이스 & 단위 및 필드
  4. 날짜 및 시간의 파싱과 포맷팅

(현재 포스팅) 0. java.time 패키지 개요

이번 개요에서는 java.time 패키지에 대해 간략하게만 소개합니다. 세부 사항들은 따로 포스팅으로 자세히 다룰 예정입니다.

0-1. 날짜 및 시간 관련 도구가 필요한 이유

  • 패키지를 이해하기 위해 먼저 날짜와 시간 관련 작업이 왜 복잡한지, 그리고 왜 더 나은 도구가 필요한지 살펴보는 것이 중요합니다.
  • 날짜와 시간 계산은 간단해 보일 수 있지만, 실제로는 다양한 요인 때문에 매우 복잡해집니다.

날짜와 시간 계산이 어려운 이유

  • 1. 각 달의 일수 차이
    • 월마다 일수(28일, 29일, 30일, 31일)가 다릅니다.
      • 예를 들어, 2월은 28일 또는 29일이고, 4월, 6월, 9월, 11월은 30일, 나머지 달은 31일입니다.
    • 날짜를 더하거나 빼는 계산을 할 때 이런 차이를 고려해야 하며, 이로인해 상당한 오류가 유발될 수 있습니다.
  • 2. 윤년 계산
    • 4년마다 2월이 29일로 늘어나는 윤년 규칙은 날짜 계산을 더 복잡하게 만듭니다. 윤년 계산은 간단해 보이지만 실제로는 조건이 여러 개 존재합니다.
    • 기본적으로 4로 나누어 떨어지는 해는 윤년이지만, 100으로 나누어 떨어지는 해는 윤년이 아니고, 400으로 나누어 떨어지는 해는 다시 윤년으로 계산됩니다.
  • 3. 일광절약시간(DST) 변환
    • 일광절약시간(DST, Daylight Saving Time)은 특정 기간 동안 시간을 한 시간 앞당기는 제도로, 시간 계산에 혼란을 더합니다. (대한민국에서는 시행하지 않는 제도입니다.)
    • 일광절약시간이 시작되거나 끝날 때는 1시간이 사라지거나 반복되므로, 이 시간을 고려한 시간 계산이 필요합니다.
  • 타임존 계산
    • 세계에는 수십 개의 타임존이 존재하며, 이는 시간 계산을 더욱 복잡하게 만듭니다.
    • 동일한 순간에 지역에 따라 시간이 다르게 표시되므로, 타임존 변환을 고려해야 합니다.
      • 또한, 일부 지역은 일광절약시간을 사용하고, 다른 지역은 사용하지 않기 때문에 타임존 계산은 더욱 어려워집니다.

0-2. java.time 패키지 소개

  • 위에서 언급한 문제들로 인해, Java의 java.time 패키지는 더 정확하고 사용하기 쉬운 날짜와 시간 관리를 가능하게 하는 다양한 클래스와 메서드를 제공합니다.
  • 이 패키지를 통해 위와 같은 복잡한 문제들을 보다 쉽게 해결할 수 있으며, 개발자가 더 신뢰할 수 있는 날짜와 시간 계산을 수행할 수 있도록 지원합니다.

java.time 주요 클래스 목록 및 용도별 분류

주요 Class & Enum

  • 주요 Enum (주로 쓰이는 것들)
    • DayOfWeek, Month
    • ChronoUnit, ChronoField
  • 주요 Class (주로 쓰이는 것들)
    • LocalDate, LocalTime, LocalDateTime
    • ZonedDateTime, OffsetDateTime, Instant
    • Period, Duration
    • TemporalAdjusters, DateTimeFormatter
  • 기타 Class (간혹 쓰이는 것들)
    • ZoneId, ZoneOffset

용도별 클래스 소개

  • 날짜와 시간 요소를 표현하는 클래스
    • Year, Month, YearMonth, MonthDay, DayOfWeek
      • 특정 년, 월, 년-월 조합, 월-일 조합, 요일 등을 표현하는 클래스입니다.
      • 참고로 DayOfWeek를 제외하곤 많이 쓰이진 않습니다. (다른 클래스의 메서드들로 충분히 대체가 되기 때문입니다)
    • LocalDate, LocalTime, LocalDateTime
      • LocalDate는 날짜(연, 월, 일, etc.)
      • LocalTime은 시간(시, 분, 초, 나노초, etc.)
      • LocalDateTime은 날짜와 시간을 함께 표현합니다.
  • 시간대와 오프셋을 고려한 클래스
    • OffsetDateTime, ZonedDateTime, Instant
      • OffsetDateTime은 시간대 오프셋을 포함한 날짜와 시간을 다룹니다.
      • ZonedDateTime은 시간대 정보를 포함한 날짜와 시간을 다룹니다.
      • Instant는 기준타임라인(1970-01-01 0시0분0초)으로부터의 특정 순간을 초 정밀도로 표현합니다.
  • 시간 간격을 표현하는 클래스
    • Period, Duration
      • Period는 연, 월, 일 단위의 기간을 표현합니다.
      • Duration은 초와 나노초 단위의 시간을 표현합니다.

java.time 핵심 인터페이스 & 단위와 필드

  • java.time 패키지에는 날짜와 시간 처리에 대한 유연성을 제공하는 여러 인터페이스가 존재합니다.

java.time 핵심 인터페이스

  • TemporalAccessor, Temporal
    • 날짜와 시간 객체에서 특정 필드를 읽거나, 이를 조작하는 데 사용되는 인터페이스입니다.
      • LocalDateTime, OffsetDateTime, ZonedDateTime, Instant 등의 주요 클래스들이 위 인터페이스를 구현합니다.
    • 참고로 TemporalTemporalAccessor를 상속받는 클래스이며, 주요한 차이점은 다음과 같습니다.
      • TemporalAccessor : 날짜와 시간 정보를 읽을 수 있는 최소한의 기능 제공 (읽기전용)
      • Temporal : 날짜와 시간을 조작하기 위한 기능을 제공 (읽기&쓰기 지원)
  • TemporalAmount
    • 시간 간격을 표현하는 PeriodDuration 클래스에서 구현되는 인터페이스입니다.

단위와 필드

  • 날짜와 시간을 다루기 위해 java.time 패키지는 다양한 단위와 필드를 제공합니다
    • ChronoUnit & ChronoField
      • ChronoUnit은 날짜와 시간의 특정 단위를 표현합니다. (참고로 "TemporalUnit" 인터페이스를 구현합니다.)
      • ChronoField는 특정 날짜 또는 시간 필드를 나타냅니다. (참고로 "TemporalField" 인터페이스를 구현합니다.)
    • 주요 메서드:
      • .get(): 특정 필드의 값을 가져옵니다.
      • .plus() or minus(): 특정 단위를 더하거나 뺍니다.
      • .isSupported(): 특정 필드 또는 단위가 지원되는지 확인합니다.
      • .with(): 특정 필드의 값을 변경합니다.

날짜 및 시간의 파싱과 포맷팅

  • 날짜와 시간의 문자열 파싱 및 포맷팅은 DateTimeFormatter 클래스를 통해 수행됩니다.
    • 이 클래스는 다양한 패턴을 사용해 날짜와 시간을 문자열로 변환하거나, 문자열을 날짜와 시간 객체로 변환할 수 있습니다.
      • 포맷팅(.format) : 날짜 & 시간 -> String
      • 파싱(.parse) : String -> 날짜 & 시간
  • java.time 패키지의 클래스들은 이 포맷터를 활용해 직관적인 날짜와 시간 처리를 지원합니다.

마무리

  • 이번 포스팅에서는 Java의 java.time 패키지에 대한 개요를 간략하게 살펴보았습니다.
  • java.time 패키지는 기존의 날짜와 시간 처리 방식에서 발생하던 여러 문제를 해결하기 위해 도입되었으며, 다양한 클래스와 인터페이스를 통해 보다 직관적이고 강력한 날짜와 시간 처리를 지원합니다.
  • 앞으로 이어질 포스팅에서는 java.time 패키지의 주요 클래스 및 인터페이스를 예제와 함께 보다 깊이 있게 다루고, 날짜 및 시간 작업을 어떻게 수행할 수 있는지 상세히 정리할 예정입니다.
      1. 주요 클래스 목록 및 용도별 분류
      1. 핵심 인터페이스 & 단위 및 필드
      1. 날짜 및 시간의 파싱과 포맷팅
profile
일 때문에 포스팅은 잠시 쉬어요 ㅠ 바쁘다 바빠 모두들 화이팅! // Machine Learning (AI) Engineer & BackEnd Engineer (Entry)

0개의 댓글