Java/Java8
(JAVA8) Optional은 언제 사용해야할까?
주누
2021. 3. 17. 00:59
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