Develop/Java

[Java] 파라미터를 Optional로 받지 말자

연로그 2022. 5. 12. 12:12
반응형

'Optional<Object클래스>' used as type for parameter '파라미터명' 경고

 

어쩌다보니 Optional 파라미터를 받는 메서드를 만들게 되었다.

노란줄이 쳐지며 경고가 떴다. 대체 왜? 🤔

private void test(Optional<Long> id) {
    // ...
}

 

😭 1. 메서드에 조건부 로직을 유도한다.

Optional 값을 바로 get()해서 사용하는 경우 노란 줄로 경고가 뜬다.

null인지 체크하지 않고 바로 사용해서 뜨는 경고다.

'Optional.get()' without 'isPresent()' check

 

따라서 메서드 내부에 해당 Optional에 null값이 확인하는 로직인 'isPresent()'를 반드시 호출해야한다.

isPresent가 true인 경우와 false인 경우를 나누는 조건부 로직이 생긴다.

 

 

😱 2. 파라미터의 값이 3가지 경우로 들어올 수 있다.

Optional을 사용하지 않으면 파라미터가 null 또는 null이 아닌 값이 들어올 수 있다.

Optional을 사용하면 총 3가지 경우가 들어올 수 있다.

 

  1. null
  2. value가 null인 Optional
  3. value가 null이 아닌 Optional

 

1은 Optional의 취지를 완전히 무시하는 행위긴 하지만 어쨌든 할당될 수는 있다.

메서드는 3가지 경우를 모두 대비해야하므로 더욱 복잡한 로직이 만들어진다.

 

노란 경고가 뜨긴 하지만 컴파일 에러가 나지는 않음

 

 

😢 3. Optional의 cost는 비싸다.

Optional은 결국 null이 될 수 있는 객체를 감싸는 Wrapper Class이므로 추가적인 비용이 들 수 밖에 없다.

 

그래서 Optional은 꼭 사용해야하는 곳에서만 사용하는게 좋다.

Java 설계자인 Brian Goetz는 Optional에 대해 아래와 같이 정의했다.

 

Optional is intended to provide a limited mechanism for library method return types where there needed to be a clear way to represent “no result," and using null for such was overwhelmingly likely to cause errors.

 

정리해보자면 Optional은 null 반환 시 오류 발생 가능성이 높은 경우에 '결과 없음'을 명확하게 드러내기 위해 설계되었다. 메서드의 반환 타입으로 사용되도록 매우 제한적이게 만들었다고 한다.

 

 

🚀 결론 - 파라미터로 쓰지 말자!

테스트 코드에서 예상 값을 파라미터로 받아오고 있었다.

검증해야하는 값이 Optional이라 예상 값도 Optional로 받아오다 발생했던 문제인데...

Optional을 파라미터로 사용하면 단점만 있지 장점이 없어서 권장하지 않는 것 같다.


참고

반응형