04.매일 자바와 함께

Optional Class

Optional 형식을 통해 도메인 모델의 의미를 명확히 만들고, null 참조 대신 값이 없는 상황을 표현해 보자.

Null 참조의 문제점

  • 에러의 근원 : NullPointerException

  • 코드를 어지럽힘 : null 확인 코드

  • 아무 의미가 없음 : null 은 아무 의미도 표현하지 않는다.

  • 자바 철학에 위배 : 자바는 개발자로부터 모든 포인터를 숨겼지만 null 포인터는 예외

  • 형식 시스템에 구멍을 만듦 : null의 의미를 알 수 없음

java.util.Optional<T>

  • 값이 있을 경우 Optional 클래스는 값을 감싼다.

  • 값이 없으면 Optional.empty

Optional 적용 패턴

Optional 객체 만들기

  • 빈 Optional

    Optional<Car> optCar = Optional.empty();
  • null이 아닌 Optional

    Optional<Car> optCar = Optional.of(car);
  • null 값으로 Optional 만들기

    Optional<Car> optCar = Optional.ofNullable(car);

Map으로 Optional 값을 추출하고 변환하기

flatMap으로 Optional 객체 연결

Optional의 직렬화 불가

  • Optional은 Serializable Interface를 구현하지 않는다.

  • Optional 클래스를 필드 형식으로 사용할 수 없으니, Optional 로 값을 반환받을 수 있는 메서드를 추가하자.

Optional 스트림 조작

Default Action & Optional unwrap

  • get() : Optional 에 값이 반드시 있을 경우 사용하자. (없을 경우 NoSuchElementException 발생)

  • orElse(T other) : Optional이 값을 포함하지 않을 때 기본값 제공

  • orElseGet(Supplier<? extends T> other) : Optional 이 비어있을 경우 기본값 생성

  • orElseThrow(Supplier<? extends X> exceptionSupplier) : Optional이 비어있을 때 예외 발생

  • ifPresent(Comsumer<? super T> consumer) : 값이 존재할 경우 인수로 넘겨준 동작 실행

  • ifPresentOrElse(Comsumer<? super T> action, Runnable emptyAction) : Optional 이 비었을 때 실행할 수 있는 Runnable을 인수로 받음

두 Optional 합치기

  • Before

  • After

필터로 특정 값 거르기

  • Optional 에 값이 있을 경우 filter 동작

Reference

Optional 활용

잠재적으로 null이 될 수 있는 대상을 Optional로 감싸기

예외와 Optional 클래스

  • 예외를 빈 Optional로 처리하기

기본형 Optional 을 사용하지 말자

  • 기본형 Optional 에는 OptionalInt, OptionalLong, OptionalDouble 등이 있다.

    • 이 기본형 특화 Optional은 다른 일반 Optional과 혼용할 수 없다.

응용

  • Optional로 프로퍼티에서 지속 시간 읽기

Date & Time API

java.time

  • java.time packageLocalDate, LocalTime, LocalDateTime, Instant, Duration, Period 등 새로운 클래스를 제공

LocalDate

  • 시간을 제외한 날짜를 표현하는 불변 객체

  • 생성

  • 사용

LocalTime

  • 날짜를 제외한 시간을 표현하는 불변 객체

  • 생성

  • 사용

LocalDateTime

  • 날짜와 시간을 모두 표현

  • 생성

  • 사용

Instant

  • 기계 전용 유틸리티

  • Unix epoch time 기준으로 특정 지점까지의 시간을 초로 표현

  • 나노초(10억분의 1초)의 정밀도 제공

Duration

  • 두 시간 객체 사이의 지속시간 Docs

Period

  • 두 시간 객체 사이의 지속 시간을 년,월,일로 표현할 경우 Docs

간격을 표현하는 날짜와 시간 클래스의 공통 메서드

Last updated