상세 컨텐츠

본문 제목

[JAVA] Optional : orElse, orElseThrow, orElseGet

JAVA

by young1403 2023. 4. 20. 02:03

본문

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()까지 실행됨을 볼 수 있다.

orElse인 경우

 

하지만 orElseGet일 경우 원했던(?)바와 같이 null일 경우에만 call_message()를 실행함을 확인할 수가 있습니다.

Optional null이 아닐경우에 orElseGet사용
Optional null인 경우에 orElseGet사용

결론
데이터가 null일 때에'만' 어떠한 '행위' 혹은 동작을 실행시키고 싶다 -> orElse 사용 주의
orElse, orElseGet의 차이점을 알고 사용하자. 

관련글 더보기

댓글 영역