-
Notifications
You must be signed in to change notification settings - Fork 0
Description
section: 8장 메서드
아이템 54. null이 아닌, 빈 컬렉션이나 배열을 반환하라
아이템 55. 옵셔널 반환은 신중히 하라
🍵 서론
NullPointerException Java로 개발을 한다면 상당히 많이 봤을 녀석입니다.
안봤다고요?
이번 아이템 54, 55에서는 null이 아닌 빈 컬렉션 혹은 배열, 옵셔널을 반환하는 것을 권장합니다. null로 인해서 발생할 수 있는 문제는 아주 심각합니다. billion dollar mistake라는 표현이 나올정도니 말이죠.
관련된 내용은 최근 작성된 null 리턴은 왜 나쁠까? - 토스 페이먼츠를 통해서 많이 알 수 있습니다.
이런 문제들을 해결하기 위해서 이펙티브 자바에서는 빈 컬렉션 혹은 배열, 옵셔널을 이용하라고 하는 것입니다.
제목으로 모든 내용을 다 설명할 수 있겠네요. 감사합니다.
🌒 본론
이렇게 날먹을 할 수는 없으니 왜 빈 컬렉션이나 배열, 옵셔널을 반환하라고 하는지 알아보자.
Item 54. null이 아닌 빈 컬렉션이나 배열을 반환하라
특정 리스트를 반환하려는데, 해당 데이터가 없는 경우가 발생할 수 있다. 예를 들면 이런 상황에서 말이다.
책에서는 이런 상황에서도 null이 아닌 비어있는 컬렉션 값, 혹은 배열을 반환하라고 한다. 그 이유는 null이 발생할 수 있는 위치에선 NPE에 대한 처리 구문을 만들어줘야 한다. 당연히 처리하면 되지 않느냐고 생각할 수 있지만 사람이다보니 빼먹을 수 있는 문제고, 그로 인해서 발생할 수 있는 손해가 너무 크기 때문이다.
아래 내용은 한번 읽어보면 좋을 내용이라서 소개를 해본다. 위 깃허브와 같은 상황에서 어떤 상태 코드를 내야 하는지에 대해 고민하는 글이다. 결론부터 말하면 200을 사용하기로 했다고 한다.
역삼역에 있는 op.gg라는 기업에서 역시 200을 사용한다.
Item 55. 옵셔널 반환은 신중히 하라
앞선 아이템에서 null을 반환해서는 안되는 이유를 알았다. Optional은 Java8에서 새로 생긴 클래스이다.
A container object which may or may not contain a non-null value.
라는 설명처럼 Optional은 null인 객체도, null이 아닌 객체도 받을 수 있다. 일단 객체도 null일 수도 아닐수도 있는데... 무슨 말이냐! 라고 할 수 있다.
Optional을 이용하면, 쉽게 얻을 수 없다.
Optional를 이용해서 그 내부 객체를 얻는 방법은 아래 코드와 같다.
public static void main(String[] args) {
Optional<String> stringOptional = Optional.empty();
String nullnull = stringOptional.get(); // NPE!!
String empty = stringOptional.orElse("orElse");
String orElseGet = stringOptional.orElseGet(() -> "orElseGet");
String orElseThrow = stringOptional.orElseThrow();
}이처럼 내부에 있는 값을 꺼내기 위해서는 추가적인 작업을 해줘야 하기 때문에, 책에서는 Optional에 대해서 다음과 같이 말한다.
옵셔널을 반환하는 메서드는 예외를 던지는 메서드보다 유연하고 사용하기 쉬우며, null을 반환하는 메서드보다 오류 가능성이 작다.
Optional이 정말 좋아보이지만, 매번 남발해서는 안된다. Optional을 주의해서 사용해야 하는 두가지 경우가 책에서 소개된다.
첫번째로 Optional이 리턴될 자리에 null을 리턴하는 경우다. 이는 Optional을 사용하는 이유가 전혀 없는 케이스이다. 뭐... 할 말이 없다..
Optional<String> stringOptional = null;
String orElseThrow = stringOptional.orElseThrow(); // NPE...두번째로는 컬렉션, 스트림, 배열, Optional과 같이 컨테이너 타입에 Optional을 사용하려는 경우다. 그 이유는 앞선 아이템 54에서 본 것과 같이, 컨테이너 타입의 경우 안에가 빈 경우엔 null이 아닌 빈 컨테이너를 리턴하는 것이 좋기 때문이다.
책에서 계속 '이런 상황은 피해라!'라는 이야기를 소개해주지만, 이런 상황에서는 Optional을 사용하라는 규칙도 소개해준다.
바로 **결과가 없을 수 있으며, 클라이언트가 이 상황을 특별하게 처리해야 한다면 Optional을 반환하라**는 것이다. 그리고 이 상황 이외에 Optional이 반환될 일은 거의 없다고한다.
🍃 결론
지금까지 null을 리턴하지 않는 방법들에 대해서 소개했다. null로 인해 발생할 수 있는 문제가 너무 많다보니까, 이후에 소개되는 Objects.requireNonNull()과 같은 방법도 생길 정도이다.
null로 인해서 생기는 문제가 정말 몰라서 그렇다기보단, 꼼꼼하지 못하게 실수했기 때문이라고 생각한다. 하지만 그 실수로 인해서 발생할 끔찍한 문제를 생각하면, Java에서 null을 안전하게 처리해주는 다양한 방법을 항상 숙지하고 생활화하는 것이 좋아보인다.
흔한 개발자들의 자리 구하는 방법
reference
이펙티브 자바 3/E
null리턴은 왜 나쁠까?
데이터가 없을 때 200인가 404인가?




