[모던 자바 인 액션] Optional 클래스

이번에 설계 프로젝트에서 백엔드 파트를 맡으면서 가장 많이 겪었던 것은 NullPointerException(NPE)이었다. 개발자들의 대부분이 겪으며, 가장 많이 겪는 예외가 NPE인 이유를 알 수 있었다. 정말 예상치 못한 곳에서 NPE가 발생하였고, 이를 방지하기 위해 JAVA 8에서 도입된 Optional의 필요성을 드디어 알게 되었다. 어떠한 기술을 배울 때 해당 기술의 필요성을 느낀다면 더욱 몰입하게 되는 것 같다. 이번 Optional 파트를 읽으면서 내 프로젝트의 어떠한 문제들을 해결할 수 있을지에 대해서도 생각해보았다.

 

1. 생각과 책임을 회피하는 가장 간단한 방법 - null

메서드의 반환 값을 결정할 때, 특정 조건으로 분기되는 경우가 있다. 예를 들어, a의 조건을 만족할 때는 A를 반환, b의 조건을 만족할 때는 B를 반환하는 식이다. 그런데 이 때, 뭘 반환해야 할 지 정확하게 정해지지 않아 null을 반환하여 문제를 해결할 수 있다. 이는 코드를 작성하는 시점에서는 가장 빠르고 쉬운 방법이지만 이후 프로그램 실행에 큰 오류를 발생시킬 수 있다. 따라서 다양한 예외 케이스를 테스트하면서 NPE가 발생하는 부분들을 체크하고, Optional로 감쌀지 말지에 대한 고민이 필요하다.

 

2. null이 발생할 경우, 조건문을 추가하는 것의 번거로움

특정 메서드로부터 null이 반환될 경우, 메서드를 호출한 쪽에서는 null에 대한 처리를 해야하는 책임이 주어지게 된다. 당장 한 개의 if문은 큰 영향이 없을 수 있다. 하지만 요구사항이 증가하고, 프로그램이 비대해지면서 추가되는 if문이 많아진다면 이 또한 가독성과 유지보수에 곤란할 수 있다. 중첩되는 if문으로 인해 들여쓰기 깊이가 증가한다면 더욱 상황은 좋지 않다. 따라서 Optional을 스트림으로 변환한 뒤, map / filter 등의 메서드를 통해 원하는 값을 추출한다면 코드를 더욱 간결하게 만들 수 있다. 만약 빈 Optional이라면 대체 값을 반환하거나 특정 행동 혹은 예외를 수행할 수 있다.

 

3. Optional을 사용해야 할 경우

  • 특정 도메인 객체의 필드가 있거나 없을 경우
    • Optional은 선택형 값을 캡슐화하는 클래스이다.
    • 값이 없으면 빈 Optional을 반환하면 된다.

Optional을 통해, 값이 있거나 없을 수 있다는 메시지를 전달할 수 있다. 만약, null이면 안되는 필드가 있다면 이는 Optional로 선언하지 않는 것이 좋다. 예를 들어, 회원의 정보를 저장할 때, 이름은 비어있으면 안되는 것이다. 괜히 NPE를 막기 위해서 이름까지 Optional로 선언하는 것은 바람직하지 않다.

 

4. 전달받은 Optional을 통해 값 추출하기

  • Optional의 map을 사용하면 스트림의 map처럼 내부에 있는 값을 조작할 수 있다.
    • map을 통해 Optional<Optional<...>> 같은 2중 Optional이 반환되지 않게 하려면 flatMap을 통해 평준화시킨다.
    • 만약 비어있는 Optional이라면 map을 사용하더라도 아무런 동작이 수행되지 않아 여전히 빈 Optional로 남는다.
  • 스트림과 마찬가지로 filter를 통해 특정 조건에 맞는 Optional을 가져올 수 있다.
    • Optional은 최대 한 개의 요소를 포함할 수 있는 스트림과 같다. 따라서 filter 조건을 만족할 경우, Optional 객체는 그대로 통과하게 된다. 만약, 조건을 만족하지 못하면 빈 Optional로 남게 된다.

 

출처 :

https://www.yes24.com/Product/Goods/77125987

 

모던 자바 인 액션 - 예스24

자바 1.0이 나온 이후 18년을 통틀어 가장 큰 변화가 자바 8 이후 이어지고 있다. 자바 8 이후 모던 자바를 이용하면 기존의 자바 코드 모두 그대로 쓸 수 있으며, 새로운 기능과 문법, 디자인 패턴

www.yes24.com

 

'Java > 모던 자바 인 액션' 카테고리의 다른 글

[모던 자바 인 액션] 동작 파라미터화  (0) 2023.11.22