본문 바로가기
자바

Optional<T>

by 이상한나라의개발자 2024. 2. 6.

자바의 Optional<T> 클래스는 Java8 부터 도입되어, "null"이 될 수 있는 객체를 감싸는 래퍼(wrapper) 클래스 입니다. Optional을 사용하면 NullPointException이 발생할 수 있는 상황을 명시적으로 회피하고, 코드의 가독성을 높일 수 있습니다. Optional은 값이 있거나 없을 수 있는 값을 나타내며, 값이 없는 경우를 더 안전하게 처리할 수 잇는 다양한 메서드를 제공합니다.

 

주요 메서드

  • Optional.of(T value) : null이 아닌 값을 갖는 Optional 객체를 생성합니다. null이면 NullPointException을 던집니다.
  • Optional.ofNullalble(T value) : 값이 null일 수 있는 경우에 사용하며, 값이 null 이면 빈 Optional을 반환합니다.
    • Optional.empty()
  • Optional.empty() : 값이 없는 빈 Optional을 반환합니다.
  • Optional.isPresent() : 값이 존재하면 true, 그렇지 않으면 false를 반환합니다.
  • Optional.ifPresent(Consumber<? super T> consumer) : 값이 존재하면 주어진 액션을 실행합니다.
  • Optional.get() : 값이 존재하면 반환하고, 값이 없으면 NoSuchElementException을 던집니다.
  • Optional.orElse(T other) : 값이 존재하면 반환하고 값이 없으면 기본값을 반환합니다.
    • 각체가 값을 포함하지 않을 때 반환할 기본 값을 직접 지정합니다. 이 메소드는 Optional 객체의 값이 있든 없는 항상 기본값을 생성합니다. 따라서 기본값의 생성 비용이 높거나 복잡한 계산을 요구하는 경우 불필요한 성능저하를 야기할 수 있습니다.
  • Optional.orElseGet(Supplier<? extends T> other) : 값이 존재하면 값을 반환하고 값이 없으면 Supplier을 통해 생성된 값을 반환합니다.
    • Optional 객치가 비어 있을 때 Supplier를 통해 제공된 대체 값을 계산하고 반환합니다. 즉, 값이 있을 경우네는 Supplier의 코드가 실행되지 않으므로 OrElse 보다 효율적으로 사용될 수 있습니다.
  • Optional.orElseThrow(Supplier<? extends X>) : 값이 존재하면 반환하고, 없으면 주어진 예외를 던집니다.

 

사용 예시

public class OptionalExam {
    public static void main(String[] args) {
        // 사용자 정보 조회
        Optional<User> userOptional = findUserById(1L);
        // ifPresent() : 값이 존재하면 실행
        userOptional.ifPresent(user -> {
            System.out.println("user1 = " + user);
        });
        // orElse() : 값이 존재하지 않으면 기본값 반환
        User user = userOptional.orElse(new User());
        System.out.println("user2 = " + user);

        // orElseGet() : 값이 존재하지 않으면 람다식 실행
        User user2 = userOptional.orElseGet(() -> new User());
        System.out.println("user3 = " + user2);

        // orElseThrow() : 값이 존재하지 않으면 예외 발생
        User user3 = userOptional.orElseThrow(() -> new RuntimeException("사용자 정보가 없습니다."));
        
        // ifPresentOrElse() : 값이 존재하면 실행, 값이 존재하지 않으면 람다식 실행
        findUserById(1l).ifPresentOrElse(user1 ->
                System.out.println("user1 = " + user1),
                () -> System.out.println("사용자 정보가 없습니다."));

    }
    public static Optional<User> findUserById(Long id) {
        User userOptional = User.builder().id(1L).name("John").email("test@email.com").build();
        return Optional.ofNullable(null);
    }
    @Data
    @Builder
    @NoArgsConstructor
    @AllArgsConstructor
    static class User {
        private Long id;
        private String name;
        private String email;
    }
}

'자바' 카테고리의 다른 글

자바에서 동일성, 동등성 비교하기  (1) 2024.04.03
Parallel Stream  (1) 2024.02.06
Stream API  (0) 2024.02.02
Lamda Method Reference  (0) 2024.01.31
Java Lamda 표현식과 Stream API  (1) 2024.01.31