언어 & 라이브러리/자바
자바 Optional이란
illlilillil
2022. 2. 19. 01:18
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을 사용하면 된다.