[JAVA8] Optional

조성권·2021년 12월 11일
0
post-thumbnail

오늘은 JAVA8의 특징 중 하나인 Optional에 대해 간략히 알아보도록 하겠다.

1. Optional이란?

Optional은 기존에 null 체크 로직에 대한 개선을 목표로 만들어진 클래스이다.

List<User> userList;

if(userList != null){
	...
}

위 예시는 기존에 null 체크를 진행하던 방식이다.
위와 같은 방식은 null 체크를 전적으로 개발자에게 맡기는 형태이기 때문에 인적 장애가 발생할 수 있는 risk가 존재한다.
이러한 인적 장애 risk를 방지하고자 만들어진 것이 Optional이다.

List<User> userList = Optional.ofNullable(getUserList())
			      .orElseGet(()-> new ArrayList<>());

Optional을 사용한다면 위와 같은 형태로 처리가 가능하다.

  • ofNullable(param): param이 null이든 null이 아니든 호출한다.
  • orElseGet(Supplier supplier): null일 경우, 함수 내부를 호출한다.

위와 같은 형태로 Optional을 사용하게 되면 추가적으로 Null 체크를 하지 않아도 되는 장점이 존재한다.


조금 더 예시를 들어보도록 하겠다.

고객의 개인정보를 담고있는 객체(=User)가 존재한다고 가정하자.
이 객체 내부에는 주소 정보를 가지고 있는 문자열 객체(=Address)가 존재한다.
담고 있는 값이 null이 아닐 경우만 return한다고 가정할 경우 기존의 방식대로라면 아래와 같이 사용할 수 있다.

User user = getUser();
	
if(user != null){
	String userAddress = user.getAddress();
	if(userAddress != null){
		return userAddress;
	}else{
		return "주소 없음";
	}
}

부모 객체가 담고있는 자식 객체가 많으면 많을수록 코드의 양은 늘어가게 된다.

만약, Optional을 사용한다면 어떻게 바뀔 수 있을까?

Optional<User> user = Optional.ofNullable(getUser());
Optional<String> address = user.map(User::getAddress());
String res = address.orElse("주소 없음");

return res;
  • orElse(T t): null일 경우, t를 수행한다.
    위에서부터 글을 읽은 독자라면 그렇다면 orElseGet()과 무슨 차이가 있는지 궁금해할 수 있다. 이에 대한 내용은 이미 많은 ref가 존재하므로 링크만 걸어두도록 하겠다.

2. Optional 사용 주의사항

  1. Optional은 return 타입으로 사용하는 것을 지향한다.
    -> setter와 같은 함수에 param으로 Optional을 받을 경우, isPresent()를 통해 추가적으로 null 체크가 필요하므로 안쓴만 못하다.
  1. Collection, Map, Array, Optional과 같은 클래스를 Optional로 또 감싸지 말자
    -> 위 클래스들은 모두 empty일 경우, 처리할 수 있는 함수들이 존재한다. 그런데 이걸 다시 Optional로 감싸는 일은 의미 없는 행동이라 볼 수 있다.
profile
천천히, 완벽히 배워나가고자 하는 웹 서비스 엔지니어

0개의 댓글