Optioinal의 예외처리
Java 8의 Optional 클래스는 null값일 수 있는 객체를 안전하게 가져올 수 있는 유용한 기능들을 제공합니다.
- orElse(default)는 Optional 값에 null이 들어올 경우에 orElse의 default 값으로 return 해줍니다.
- orElseGet( () -> default )은 Optional 값에 null이 들어올 경우에 default 값으로 return 해줍니다.
- orElseThrow는 Optional 객체가 비어있을 경우에 (값이 리턴되는게 아닌) 예외를 던집니다.
orElse와 orElseGet의 차이는 없는 것인가?
결론부터 말하면
orElse는 Optional에 들어오는 값이 null이 아닌 경우에도 orElse(default)의 default에 해당하는 (ex)함수를 실행한다는 점.
반면 orElseGet은 null일 경우에만 실행한다는 점. 에서 큰 차이가 있다.
null값 체크 검증 후 값을 가져오려고 orElse를 썼는데 null인 값에서 데이터를 찾을경우 NPE를 마주칠 수 있는것이다.
아래 코드를 통해 orElse와 orElseGet의 동작에 대해 이해를 더해보자.
@Test
void Optional_orElse_테스트() {
System.out.println("orElse 테스트를 실행했습니다.");
String defaultMessage = "null입니다";
Optional.ofNullable(defaultMessage)
.orElse(call_message());
}
@Test
void Optioinal_orElseGet_테스트() {
//System.out.println("orElseGet에 null이 들어갔습니다.");
//String defaultMessage = null;
System.out.println("orElseGet 테스트를 실행했습니다.");
String defaultMessage = "null입니다";
Optional.ofNullable(defaultMessage)
.orElseGet( () -> call_message());
}
public String call_message() {
System.out.println("orElse를 Call했습니다.");
return "no data";
}
말로 풀어보면 orElse테스트와 orElseGet 테스트 모두 Optional에 들어오는 defaultMessage의 값이 null일 경우에만
call_message()를 호출하도록 되어있습니다.
위에서 한번 설명했듯이 orElse일 경우엔 defaultMessage가 null이 아님에도 call_message()까지 실행됨을 볼 수 있다.
하지만 orElseGet일 경우 원했던(?)바와 같이 null일 경우에만 call_message()를 실행함을 확인할 수가 있습니다.
결론
데이터가 null일 때에'만' 어떠한 '행위' 혹은 동작을 실행시키고 싶다 -> orElse 사용 주의
orElse, orElseGet의 차이점을 알고 사용하자.
추상 클래스와 인터페이스의 차이 (0) | 2023.04.20 |
---|---|
[JAVA] Call by Value , Call by Reference의 차이와 heap & stack 관점에서의 이해 (0) | 2022.12.01 |
인스턴스 멤버와 정적멤버 (0) | 2022.05.12 |
댓글 영역