카테고리 없음

[Effective Java] Item55. 옵셔널 반환은 신중히 하라

niniz 2022. 7. 30. 13:37

메서드가 특정 조건에서 값을 반환할 수 없을 때 예외를 던지거나, null을 반환합니다. 예외는 진짜 예외적인 상황에서만 사용해야하며 예외를 생성할 때 스택 추적 전체를 캡처하므로 비용도 상당합니다. null을 반환하면 메서드를 호출할 때 마다 null처리는 해야하며 그렇지 않으면 언젠가는 NullPointerException이 발생할 수 있습니다.

Optional<T>

자바 8에서는 하나의 선택지가 더 생겼습니다. Optional<T>는 null이 아닌 T가 있거나 없을 수 있습니다. Optional은 원소를 최대 1개 가질 수 있는 불변컬렉션입니다. (실제로는 Collection<T>를 구현하지는 않았습니다.)

public static <E extends Comparable<E>> E max(Collection<E> c) {
    if (c.isEmpty()) throw new IllegalArgumentException("빈 컬렉션");

    E result = null;
    for (E e : c) {
        if (result == nulll || e.compareTo(reseult) > 0) {
            result = Objects.requireNonNull(e);
        }
    }
    return result;
}

위의 메서드에 빈 컬렉션을 건네면 IllegalArgumentException을 던집니다.

public static <E extends Comparable<E>> Optional<E> max(Collection<E> c) {
    if (c.isEmpty()) return Optional.empty();

    E result = null;
    for (E e : c) {
        if (result == nulll || e.compareTo(reseult) > 0) {
            result = Objects.requireNonNull(e);
        }
    }
    return Optional.of(result);
}

위와 같이 Optional을 반환하도록 구현하면 Exception비용이 들지않습니다.

이때 메서드를 호출한 쪽에서는 3가지 방법으로 반환값을 처리할 수 있습니다.

  1. 기본값을 정할 수 있습니다.
    max(words).orElse("단어 없음");

  2. 원하는 예외를 던질 수 있습니다.
    max(words).orElseThrow(NoWordException::new);

  3. 항상 값이 있다고 가정합니다.
    max(words).get();

반응형