ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Java] Optional 클래스
    프로젝트/Share Your Trip 2024. 1. 6. 20:16

    Optional 클래스 왜 궁금했을까❓

    - SSAFY 1학기 프로젝트를 리팩토링하기 위해 다른 사람들의 블로그를 참고해가며 Error Handling에 대해 공부를 하고 있었는데 Optional 클래스가 사용되는 것을 보았다.
    - 대부분의 포스팅들에서도 Optional 클래스가 사용되고 있었고 중요도가 높다고 생각이 들어 정리해보려고 한다.

     

    Optional 클래스

    Java 8에서부터 Optional<T> 클래스를 사용하여 NPE(NullPointerException)이 발생하지 않도록 방지할 수 있는 Wrapper 클래스이다.
    public final class Optional<T> {
        /**
         * Common instance for {@code empty()}.
         */
        private static final Optional<?> EMPTY = new Optional<>();
    
        /**
         * If non-null, the value; if null, indicates no value is present
         */
        private final T value;
        
        ...
    }

     

    Optional 클래스 객체 생성

    Optional.empty()

    • Optional은 Wrapper 클래스이기 때문에 값이 없을 수도 있는데 null 대신에 Optional.empty()를 사용하여 대체한다.
    • 위 코드에서 볼 수 있듯이 Optional 클래스는 내부에서 static 변수로 EMPTY 객체를 생성하여 공유함으로써 메모리를 절약하고 있다.
    Optional<String> empty = Optional.empty();
    
    System.out.println(empty); // Optional.empty
    System.out.println(empty.isPresent()); // false

     

    Optional.of()

    • Optional의 값이 절대 null이 아니라면 Optional.of()를 이용하여 객체를 생성한다. 
    • 만약, Optional.of()를 이용하여 null을 저장하려고 하면 NPE가 발생한다.
    // Optional의 value는 null 값이 들어올 수 없다.
    Optional<String> optional = Optional.of("cks._.hong");

     

    Optional.ofNullable()

    • Optional의 값이 null이거나 null이 아닐 수도 있는 경우에는 Optional.ofNullable을 이용하여 객체를 생성하다.
    • 생성 이후, 값이 없는 경우에는 orElse나 orElseGet 함수를 통해서 값을 가져올 수 있다.
    // Optional의 value는 null일 수도 있고 아닐 수도 있다.
    Optional<String> optional = Optional.ofNullable(getBlogName());
    // 값이 없다면 "cks._.hong"을 return 한다.
    String blogName  = optional.orElse("cks._.hong");

     

    Optional 클래스 내장 함수

    Method Description
    empty() 비어있는 Optional 객체 반환
    isPresent() 값의 존재 유무를 반환
    get() Optional 객체의 Value를 반환
    (값이 null이면 NoSuchElementException이 발생)
    orElse() 값이 존재하면 값을 반환하고 없다면 인수로 전달된 값을 반환
    orElseGet() 값이 존재하면 값을 반환하고 없다면 인수로 전달된 함수의 결과 값을 반환
    orElseThrow() 값이 존재하면 값을 반환하고 없다면 인수로 전달된 예외 발생
    •  이 외에도 map, flatmap, stream, filter 함수를 지원한다.

     

    Optional 클래스 주의사항 ⚠️

    - Optioanl 클래스는 값을 Wrapping, Unwrapping, null일 경우의 대체 함수 호출 등의 오버헤드가 존재하여 시스템의 성능 저하로 이어질 수 있다.
    - 따라서, Optional은 메소드의 결과가 null이 될 수 있으며, null에 의한 오류가 발생할 가능성이 높을 때만 사용해야 한다.

     

     

    프로젝트 활용

    • 유저 ID를 이용하여 유저를 찾는 API인데 해당 과정에서 USER의 정보가 null 일 수도 있어서 활용해 보았다.
    • 다른 API 함수들도 체크하여 리팩토링을 진행할 예정이다.
    • 추가적으로, Client Response에 대해서도 map 방식이 아닌 공통 Response Structure를 만들어 일관성있는 응답을 만들어 나아갈 예정이다.
Designed by Tistory.