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가 불변 객체라는 것을 보여주는 좋은 예입니다. 어떤 연산을 수행하더라도 원본 객체는 변경되지 않으며, 항상 새로운 인스턴스가 생성됩니다.