본문 바로가기
언어 & 라이브러리/자바

자바 Optional이란

by illlilillil 2022. 2. 19.

Optional 이란 NullPointerException을 피하기 위해 만들어진 클래스입니다.

UserVO userVO = getUser();
if (userVO != null) {
  Address address = user.getAddress();
  if (address != null) {
    String postCode = address.getPostCode();
    if (postCode != null) {
      return postCode;
    }
  }
}
return "우편번호 없음";

이렇게 Optional 사용하지 않으면 null 체크를 반드시 해야해서 번거로움이 많습니다.

Optional<UserVO> userVO = Optional.ofNullable(getUser());
Optional<Address> address = userVO.map(UserVO::getAddress);
Optional<String> postCode = address.map(Address::getPostCode);
String result = postCode.orElse("우편번호 없음");
 
// 그리고 위의 코드를 다음과 같이 축약해서 쓸 수 있다.
String result = user.map(UserVO::getAddress)
    .map(Address::getPostCode)
    .orElse("우편번호 없음");
return result;
String name = getName();
String result = "";

try {
  result = name.toUpperCase();
} catch (NullPointerException e) {
  throw new CustomUpperCaseException();
}

가독성도 떨어지고 번잡합니다.

Optional<String> nameOpt = Optional.ofNullable(getName());
String result = nameOpt.orElseThrow(CustomUpperCaseExcpetion::new).toUpperCase();

단 두 줄로 표현이 가능합니다.

Optional.of 는 인자로 null 값을 받지 않겠다는 말이며

Optional.ofNullable은 인자로 null이 가능합니다.

String name = null; 
Optional<String> opt = Optional.ofNullable(name);

 

 

orElse 와 orElseGet의 차이

  • orElse: Optional 안의 값이 null이든 아니든 항상 호출된다.
  • orElseGet: Optional 안의 값이 null일 경우에만 호출된다.
  •  

[ orElse VS orElseGet 사용 정리]

  • orElse
    • Optional의 값이 null이든 아니든 항상 호출된다.
    • 그에 따른 비용이 추가되고, 문제가 발생할 수 있다.
    • 값이 미리 존재하는 경우에 사용한다.
  • orElseGet
    • Optional의 값이 null일 경우에만 호출된다.
    • 비용이 orElse보다 저렴하며, 불필요한 문제가 발생하지 않는다.
    • 값이 미리 존재하지 않는 거의 대부분의 경우에 orElseGet을 사용하면 된다.

댓글