오늘은 JAVA8의 특징 중 하나인 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가 존재하므로 링크만 걸어두도록 하겠다.