Computer >> 컴퓨터 >  >> 프로그래밍 >> Java

Java 9의 JShell에서 java.time.LocalDate를 활용하는 방법

JShell이란 무엇인가?

JShell은 Java 9에서 처음 도입된 REPL(Read-Eval-Print-Loop) 대화형 도구입니다. 사용자가 입력한 코드를 즉시 평가하고 그 결과를 바로 출력해 주기 때문에, 간단한 코드 조각을 테스트하거나 Java의 새로운 기능을 학습할 때 매우 유용합니다.

LocalDate 클래스 소개

java.time.LocalDate 클래스는 날짜 정보를 손쉽게 조회할 수 있는 다양한 메서드를 제공합니다. 이 클래스를 통해 다음과 같은 정보를 얻을 수 있습니다.

  • 날짜 관련 정보: 연도, 월, 일, 요일 등
  • 날짜 메타 정보: 윤년 여부, 해당 월의 일수, 해당 연도의 총 일수 등 분류 관련 정보

또한 LocalDate불변(immutable) 클래스이므로 기존 객체를 수정하지 않습니다. 대신 plusDays(), minusMonths() 같은 메서드를 사용해 일, 월, 연도를 더하거나 뺄 수 있으며, 각 연산은 항상 새로운 LocalDate 인스턴스를 반환합니다.

아래 두 개의 코드 스니펫을 통해 LocalDate 클래스의 다양한 연산 결과를 확인해 보겠습니다.

스니펫 1: 날짜 정보 조회

jshell> import java.time.*;

jshell> LocalDate today = LocalDate.now()
today ==> 2020-04-22

jshell> today.getYear()
$3 ==> 2020

jshell> today.getDayOfWeek()
$4 ==> WEDNESDAY

jshell> today.getDayOfMonth()
$5 ==> 22

jshell> today.getDayOfYear()
$6 ==> 113

jshell> today.getMonth()
$7 ==> APRIL

jshell> today.getMonthValue()
$8 ==> 4

jshell> today.isLeapYear()
$9 ==> true

jshell> today.lengthOfYear()
$10 ==> 366

jshell> today.lengthOfMonth()
$11 ==> 30

위 예제에서 확인할 수 있듯이, getYear(), getDayOfWeek(), getDayOfMonth() 등의 메서드로 현재 날짜의 세부 정보를 조회할 수 있습니다. 특히 2020년은 윤년이기 때문에 isLeapYear()true를 반환하고, lengthOfYear() 역시 366일로 나타나는 점에 주목할 만합니다.

스니펫 2: 날짜 더하기와 빼기

jshell> today.plusDays(50)
$12 ==> 2020-06-11

jshell> today.plusMonths(50)
$13 ==> 2024-06-22

jshell> today.plusYears(50)
$14 ==> 2070-04-22

jshell> today.minusYears(50)
$15 ==> 1970-04-22

jshell> LocalDate yesterYear = today.minusYears(50)
yesterYear ==> 1970-04-22

jshell> today
today ==> 2020-04-22

plusDays(), plusMonths(), plusYears() 메서드를 사용하면 지정한 만큼의 기간을 더한 새로운 날짜를 얻을 수 있고, minusYears()처럼 minus 계열 메서드로 과거 날짜를 계산할 수도 있습니다.

마지막 부분이 중요한데, yesterYear 변수에 50년 전 날짜를 할당한 후 다시 today를 출력해 보면 여전히 2020-04-22로 유지되는 것을 확인할 수 있습니다. 이것이 바로 LocalDate가 불변 객체라는 것을 보여주는 좋은 예입니다. 어떤 연산을 수행하더라도 원본 객체는 변경되지 않으며, 항상 새로운 인스턴스가 생성됩니다.