티스토리 뷰
Item55에서는 옵셔널 반환을 신중히 하라 말한다
참고 글에서는 옵셔널이 보기만큼 쉬운 녀석이 아니라고 하며
무언가를 사용할 때 왜 만들어졌는지, 어떤 방식으로 테스트되었는지를 반드시 확인하라 한다
위 글에는 Optional의 여러 API들을 사용하는 방법과 best-practice를 안내하고 있으니 시간이 있다면 읽어보자
Optional에 대해 자바 설계자 브라이언 고츠는 아래와 같이 정의한다
많은 이가 사용하는 라이브러리 메서드는 값이 없는 경우
null을 반환하면 에러 발생 가능성이 높아지니 대안으로 값이 없다는 것을 제한된 방식으로 나타내기 위해 만들어졌다고 한다
Optional이라는 컨테이너를 만들고 그 안에 값이 있든 없든 반환하고
클라이언트 쪽에서 값이 있는 경우와 없는 경우를 고려해 사용하면 된다
null을 반환할 때보다 좋은 것은 if (어쩌구 != null)와 같은 명시적인 null 체크 없이
Optional의 유연한 메서드 체이닝으로 해결할 수 있다는 점이다
그럴 리가 있겠냐만은 메서드 작성 시 반환 타입으로 Optional<T>로 설정한 후 null을 반환해서는 절대 안 된다
Optional 반환 값에 대해 null 체크를 해야하는 기이한 상황이 나타날 수 있기 때문이다
값이 없는 경우를 명시적으로 반환해야할 때는 Optional.empty()를 사용해야 한다
여기까지만 본다면 Optional의 등장으로 꽃밭이 펼쳐진 것처럼 보인다
그럼 Optional은 최강인가?, 아래는 Optional의 안티 패턴을 보여준다
자바 8을 배우면 Stream, Optional의 간결함 때문에 기존 코드를 싸그리 갈아엎어버리고 싶은 충동이 있을 텐데
이를 실무에 적용하는 사람도 있을 수 있다, 난 실제로 아래 코드를 마주친 적이 있다
한 줄 안에서 처리하고, 값이 있는 경우와 없는 경우를 모두 고려한 반환이라 그다지 나쁠 게 없어 보이는데 뭐가 문제일까?
Optional과 null-check 비교 테스트를 참고해보자, 내 컴퓨터에서는 Optional이 대략 2~3배 정도 시간이 더 걸렸다
Java vs Rust의 Optional 성능 비교를 한 흥미로운 글도 참고해보자
JDK17에서 null 체크 최적화가 잘 되었는지 JDK16보다 2배 가까이 성능 향상됐고 Optional에 비해 약 8배 빨라졌다
Rust는 C를 대체하기 위한 언어라 그런지 Java Optional에 비해 30배 가까이 빠른 결과를 보여준다
Java 배우기도 바쁘지만 언젠가는 Rust 찍먹도..
최신의 멋진 API보다 조금은 후져 보여도 명료한 코드가 훨씬 좋다
웹 개발을 한다면 Optional vs Null-check는 의미 없는 수치일 수 있다
Optional의 오버헤드는 외부 통신, DB 들락날락에 비교하면 발톱 때 수준이다
수많은 인스턴스들이 Optional에 감싸져 있을 확률도 거의 없거니와 Optional에 Collection을 넣는 것은 안티 패턴이다
컬렉션은 빈 컬렉션 그 자체로 값이 비어있음을 나타낼 수 있다
Optional을 어디까지 쓰느냐는 온전히 개발자에게 달렸다
개발팀의 컨벤션을 따르거나 성능 측정을 해보고 문제가 없을 경우에 사용하도록 하자
마지막으로 오라클의 Optional 설계 사상을 보고 가자
스트림에서 null을 우아하게 다룰 방법으로 고안했으나 다른 곳에서도 유용하게 쓰일 수 있어 지금은 사용 범위가 확대됐다
'Java > Effective Java' 카테고리의 다른 글
[Item57] 변수는 없애거나 줄이거나 (0) | 2022.06.03 |
---|---|
[Item56] 주석은 죄가 아니다 (0) | 2022.05.23 |
[Item54] null 멈춰 (0) | 2022.05.09 |
[Item53] 가변 인수 대신 컬렉션 (0) | 2022.05.07 |
[Item52] 다중정의는 타입이 다르게 (0) | 2022.05.05 |