ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Optional 정리
    java 2021. 5. 28. 20:23

    배경

    https://stackify.com/optional-java/

    위 글 번역하며 정리

     

    Overview

    Optional이 설계된 주된 이슈는 자바에서 매우 중요한 NullPointerException을 안전하게 다루기 위함이다. 우선, Optional은 값을 래핑하는 클래스다. 값이 비어 있거나 객체로 채워져 있을 수 있다. Optional은 함수형 프로그래밍과 밀접하게 연관되어 있다.

     

     

    Optional 객체 만들기

    빈 객체

    empty() static 메서드를 통해 미리 만들어둔 불변 객체를 반환한다. empty인 상태에서 get()을 호출하면 NoSuchElementException이 발생함을 알 수 있다. 또한 Optional의 value는 final이 붙은 불변객체이므로 미리 만들어둔 empty()를 재활용해도 무방하다. 

     

    값이 있는 객체

    of()를 이용하면 null이 아닌 객체를 전달해야하고 ofNullable()를 이용하면 null인 객체를 전달해도 예외를 던지지 않는다. 즉, null이 아님을 확신한다면 of()를 이용해 생성하자.

     

    값 접근하기

    get()을 사용해 Optional의 값을 가져올 수 있지만 NullPointerException에서 안전하지 못하다. 다양한 접근방법을 알아보자.

     

    ifPresent()

    단순히 true, false를 판별하도록 할 수 있고 Comsumer를 넘겨 특정 action을 수행하도록 설계할 수 있다.

     

     

    orElse()

    orElse()를 이용하면 원하는 값을 get하거나 null인 경우 대체 값을 반환하도록 설계할 수 있다. 또한, Supplier를 넘겨 값이 null인 경우 원하는 예외를 던지거나 다른 값을 반환하도록 설계할 수 있다.

     

    여기서 orElse()와 orElseGet()의 차이를 알아보자. 육안으로 보면 둘 다 삼항연산자를 사용해 별 차이가 없어보이지만 성능에서 차이가 있다. 우선 orElse()경우 값을 만들어서 전달하는 반면, orElseGet()은 콜백을 전달해 null인 경우 값을 만들어 전달한다. 즉, 성능에서 orElseGet()이 유리한 부분이다. orElse()를 사용하는 건 정적 값을 넘길 때만 사용하고 그냥 웬만하면 orElseGet()을 쓰면 될 것 같다.

     

    값 변경하기

    map()

    value가 null이 아닌 경우에도 map을 통해 함수형으로 값을 변형하여 전달할 수 있다. 다만, 반환형이 Optional인 경우 제네릭스는 제네릭스의 하위타입이 아니라는 제약 때문에 flatMap을 사용해야 한다.

     

    flatMap()

    잘 생각해보면 직관적으로 이해가 가능하다.

     

    filter()

     

     

    자바 9부터 추가된 내용

    or()

    flatMap()과 마찬가지 이유로 orElseGet()과 동작은 동일하나 반환형을 Optional로 하고 싶을 때 or()를 사용하자.

     

    ifPresentOrElse()

    ifPresent() 경우 값이 존재하는 경우 Consumer를 수행하지만 값이 존재하지 않는 경우는 따로 처리할 수가 없다. 이런 요구사항을 반영한 메서드다.

     

    stream()

    단일 객체인 경우 거의 쓸 일은 없을 것 같고 value가 컬렉션인 경우 get -> stream을 한번에 stream으로 변환하는 메서드를 제공한 듯하다. 축지법 정도??

     

     

    유용한 팁

    Optional은 직렬화를 지원하지 않는다. Optional을 필드로 포함한 객체 또한 직렬화는 피하는 게 좋다. 정 쓰고 싶다면 Jacson에서 Optional을 값 또는 null로 매핑해주는 기능이 있긴 하다.

     

    Optional의 주목적은 return type에 있다. Optional이 보이면 바로바로 값을 얻거나 정해진 행동을 하자.

     

    'java' 카테고리의 다른 글

    Generics와 wildcard  (0) 2021.06.01
    Stream 정리 및 예제  (0) 2021.05.29
    Inner class와 static 조합  (0) 2021.05.27
    Effective Java 모든 객체의 공통 메서드  (0) 2021.05.25
    람다 정리 및 예시  (0) 2021.05.19

    댓글

Designed by Tistory.