Java/time

Java time 패키지 - TemporalAdjusters 클래스

ysk(0soo) 2022. 12. 8. 23:13

TemporalAdjusters

  • 자주 쓰일만한 날짜 계산들을 대신 해주는 메서드를 정의해 놓은 클래스
    • 예시 : 다음 주 월요일의 날짜를 계산할 때 TemporalAdjusters에 정의된 next()를 사용한 예
LocalDate today = LocalDate.now();
LocalDate nextMonday = today.with(TemporalAdjusters.next(DayOfWeek.MONDAY));
  • 메서드 종류
메서드 설명
firstDayOfNextYear() 다음 해의 첫 날
firstDayOfNextMonth() 다음 달의 첫 날
firstDayOfYear() 올 해의 첫 날
firstDayOfMonth() 이번 달의 첫 날
lastDayOfYear() 올 해의 마지막 날
lastDayOfMonth() 이번 달의 마지막 날
firstInMonth(DayOfWeek dayOfWeek) 이번 달의 첫 번째 ?요일
lastInMonth(DayOfWeek dayOfWeek) 이번 달의 마지막 ?요일
previous(DayOfWeek dayOfWeek) 지난 ?요일(당일 미포함)
previousOrSame(DayOfWeek dayOfWeek) 지난 ?요일(당일 포함)
next(DayOfWeek dayOfWeek) 다음 ?요일(당일 미포함)
nextOrSame(DayOfWeek dayOfWeek) 다음 ?요일(당일 포함)
dayOfWeekInMonth(int ordinal, DayOfWeek dayOfWeek) 이번 달의 n번째 ?요일

 

TemporalAdjuster 인터페이스

@FuntionalInterface
public interface TemporalAdjuster {
    Temporal adjustInto(Temporal temporal);
}
  • 추상메서드 하나만 정의되어있고, 이 메서드만 구현하면 됨
  • 실제로 구현하는 것은 adjustInto()지만, 같이 사용해야 하는 메서드는 with()
    어느 쪽을 사용해도 되긴 함
    adjustInto() : 내부적으로 사용할 의도로 작성
    with() : 되도록 사용할 것
  • adjustInto()의 매개변수
    날짜와 시간에 관련된 대부분의 클래스가 Temporal 인터페이스를 구현하였기 때문에 adjustInto의 매개변수가 될 수 있음

 

TemporalAdjuster 직접 구현하기

  • 보통은 TemporalAdjusters에 정의된 메서드로 충분
  • 필요할 경우, 자주 사용되는 날짜계산을 해주는 메서드를 직접 만들 수도 있음
  • LocalDate의 with는 다음과 같이 정의되어있고, TemporalAdjuster인터페이스를 구현한 클래스의 객체를 매개변수로 제공
    LocalDate With(TemporalAdjuster adjuster)
  • with()
    LocalTime, LocalDateTime, ZonedDateTime, Instant 등 대부분의 날짜와 시간에 관련된 클래스에 포함되어있음
  • TemporalAdjuster 인터페이스 구현
  • 날짜와 시간에 관련된 대부분의 클래스가 Temporal 인터페이스를 구현하였기 때문에 adjustInto의 매개변수가 될 수 있음
  • 예제) 특정 날짜로부터 2일 후의 날짜를 계산하는 DayAfterTomorrow
Class DayAfterTomorrow implements TemporalAdjuster {
     @Override
     public Temporal adjustInto(Temporal temporal) {
         return temporal.plus(2, ChronoUnit.DAYS); // 2일을 더하기
     }
}

참조

  • 자바의 정석