본문 바로가기

Java/Java8

(JAVA8) Optional은 언제 사용해야할까?

Optional은 자바 8에 추가된 인터페이스로써 비어있을 수도 있고 무언가를 담고 있을 수 도 있음을 의미하는 컨테이너 인스턴스의 타입이다.

Optional을 어디에 쓴다는 제약조건은 없지만 리턴 타입에 쓰는 것이 권장사항이다.
우리는 이러한 권장사항에 대해서 알아보도록 하자!

 

매서드 매개변수 타입으로 사용할 때

먼저 메서드 매개변수 타입으로 쓸 때를 살펴보자

아래와 같이 Optional 타입의 메서드 파라미터를 받아서 변수를 저장하는 setter 메서드를 예시로 들어보자!

public void setProgress(Optional<Progress> progress) {
    progress.ifPresent(p -> this.progress = p);
}

만약 이렇게 파라미터에 null을 직접적으로 넣어주는 경우엔 NPE가 발생하게 된다. (Optional을 쓴 의미가 없음)

OnlineClass springBoot = new OnlineClass(1, "spring boot", true);
springBoot.setProgress(null);

실행 결과

뭐 이렇게 예외를 처리할 수 도 있겠지만 이런 것을 안 하려고 Optional이 만들어졌는데 이것 또한 Optional을 사용하는 의미가 없어진다.

public void setProgress(Optional<Progress> progress) {
    if (progress != null) {
        progress.ifPresent(p -> this.progress = p);
    }
}

 

맵의 키 타입으로 사용할 때

맵의 "가장 중요한 특징 중 하나가 Key는 Null이 아닙니다."이다

근데 Key가 Null일수도 있으니 Key를 Optional로 감싸는 것은 어불성설이다.

 

 

필드 타입으로 사용할 때

설계적인 측면에서 보자면 해당 필드가 있을 수 도 있고 없을 수도 있다는 뜻이다.

그렇다면 Optional을 사용하기 전에 해당 필드가 해당 클래스에 왜 존재해야 하는지에 대해서 먼저 생각해보는 것이 좋을 것 같다.


References

https://stackoverflow.com/questions/26327957/should-java-8-getters-return-optional-type/26328555#26328555

 

Should Java 8 getters return optional type?

Optional type introduced in Java 8 is a new thing for many developers. Is a getter method returning Optional type in place of the classic Foo a good practice? Assume that the value can be

stackoverflow.com