JAVA

[JAVA] OPTIONAL

집한구석 2022. 5. 30. 11:02
728x90

Kotlin null safy 확장자 공부하다가, 기왕에 optional도 정리


Optional

  • Null일수도 Null이 아닐수도 있는 값을 감싸는 Wrapper 클래스, 참조시 Null이어도 NullPointException이 발생하지 않게 해줌

Optional 생성메소드

종류 설명
of Null이 아닌 오브젝트로 생성, Null인 오브젝트로 생성을 시도할 경우 NullPointException 발생
empty 빈 Optional 생성
ofNullable Null인지 아닌지 알지 못하는 오브젝트로 Optional 생성

Optional 값 체크 및 가져오기 메소드

종류 설명
isPresent Optional에 담겨있는 오브젝트가 null인지 체크
get Optional에 담겨있는 값 가져오기
orElse Optional이 null이 아닌경우 Optional에 담겨있는 값을 리턴하고 아닌 경우, orElse에 정의된 값이 리턴
orElseGet Optional이 null이 아닌경우 Optional에 담겨있는 값을 리턴하고 아닌 경우, Supplier로 공급된 값을 리턴
orElseThrow Optional이 null이 아닌경우 Optional에 담겨있는 값을 리턴하고 아닌 경우 정의한 Exception 발생

Optional 응용 메소드

종류 설명
ifPresent Optional이 null이 아닐경우 실행
map Optional이 null이 mapper를 적용
flatmap mapper의 리턴값이 또 다른 Optional이라면 한단계의 Optional이 되도록 해줌

Optional 사용할 경우

  • Optional에 null을 할당 X
  • 단순히 값을 얻으려는 목적으로 사용하지 말자
  • 생성자, 수정자, 메소드 파라미터를 Optional로 넘기지 말자
  • Collection인 경우 Optional을 사용하지말고 빈 Collection으로 넘겨야함
  • 반환 타입으로만 사용하자
  • 값이 없을 경우 orElse를 사용하지 말고 orElseThrow, orElseGet으로 기본값 반환을 정의하자

Optional을 남발하지 말아야하는 이유

  • 코드의 가독성을 떨어뜨림
  • 시간적, 공간적 비용이 증대됨, Optional객체에 저장하기 위한 메모리비용과 Optional객체에 데이터 접근 비용 증대
  • 직렬화 문제가 발생할 수 있음 (Optional은 직렬화를 지원하지 않음)