Growth-Collectors / effective-java

repository for effective java study
3 stars 2 forks source link

아이템 55. 옵셔널 반환은 신중히 하라 #55

Open HanaHww2 opened 1 year ago

eternalklaus commented 1 year ago

상황: 특정 연산의 리턴값이 "있을수도 없을수도 있다"

Optional

Optional을 사용하지 않는 예제

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==null || e.compareTo(result) > 0)
            result = Objects.requireNonNull(e);

    return result; // E 타입의 값을 리턴
}

Optional을 사용하는 예제

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==null||e.compareTo(result) > 0)
            result = Objects.requireNonNull(e);

   return Optional.of(result); // E타입의 값이 들어있는 옵셔널을 리턴한다 
}

주의할 점

옵셔널 어디에 쓰이고 있을까?

옵셔널 사용해 보기

옵셔널을 사용하지 말아야 하는 경우

옵셔널을 사용해야 하는 경우

HanaHww2 commented 1 year ago

(갑자기,,)예전에 조사해보았던 자바의 단점 + 개인적으로도 공감하는 NPE 에 대한 불만을 공유합니다.

  1. NullPointerExeption

자바의 런타임 예외(Exception)중 NullPointerException(이하 NPE)은 다음과 같은 상황에서 발생합니다.

NPE는 꼭 필요한 예외지만 개발을 하다보면 NPE가 발생한 시점을 찾기 어렵고 오류 메시지도 구체적으로 어디서 발생했는지 명시해 주지 않기때문에 자칫 잘못하면 디버깅에 많은 시간을 허비할 수 있습니다. 즉, null 처리 관련 책임을 언어 차원이 아닌, 프로그래머에게 전적으로 위임하게 됩니다.

cf) 코틀린에서의 null 처리 동일한 JVM 계열 언어이지만 아래와 같은 특징으로 자바와 차이점을 보이고 있다.

즉, NPE는 충분히 언어차원에서 방지할 수 있다는 점을 통해 자바에서 개발자에 의한 NPE 처리는 설계적 결함이라고 생각합니다.

YunDaHyee commented 1 year ago

제가 있는 실무에서도 옵셔널을 많이 쓸 수 있게 되면 좋겠네요..

jioome commented 1 year ago

옵셔널 반환을 할 경우 null값인지 주의해야겠네요