본문 바로가기

Optional

 

  java8에서 등장한 Optional에대해서 정리해보자. `Optional` 은 null 관련 문제를 해결해주기위해서 등장했다. 아래와 같이 null이 일어날 상황을 가정해서 코드에 녹여야했다. 런타임 과정에서 null인 객체가 로직에 포함되연서 NPE를 발생시킬 가능성이 있기때문에 이렇게 체크를 해야한다. 이런 방어코드 때문에 유지보수가 점점 힘들어지게 된다.

 

public User findUserById(Long id) {

  User user = userService.find(id);
  
  if(user == null) new NotFoundUserException("존재하지 않는 사용자 입니다.!!!");
  return user;
}

 

이제 `Optional` 을 이용해서 위의 코드를 개선시켜보자. id값으로 얻은 User가 null인경우 Exception을 발생시키도록 이렇게 코드를 개선시켰다.

public User findUserById(Long id) {

  User user = userService.find(id);
  return Optional.of(user)
  			.orElseThrow(()-> new NotFoundUser("존재하지 않는 사용자 입니다."));
  
}

 

 

 

 

of, ofNullable

 

  Optional객체를 생성하기 위해 제공되는 정적 팩토리 메서드이다. `of`는 null이 아닌 객체를 담고 있는 Optional객체를 생성한다. 반면, ofNullable은 null인지 아닌지 확신할 수 없는 상황의 객체를 담아서 Optional객체를 생성한다. `of`는 null이 아니라는것을 확신할 수 있을때 사용해야한다. (NPE발생)

 

get,orElse, orElseGet, orElseThrow

  원하는 객체를 Optional으로 한단계 랩핑시켰다. 이제 진짜 원하는 객체를 꺼내오고 싶으면 어떻게 해야할까? get는 비어있는 Optional에 대해서 NoSuchElementExceptiond을 발생시킨다. orElse는 값의 유무와 상관없이 실행되는데 값이 없는경우 orElse의 파라미터로 받은 객체를 반환한다. orElseGet은 값이 없는경우에만 실행되서 파라미터로 받은 객체를 반환한다. orElseThrow는 값이 비어있는경우 예외를 발생시킨다.

 

 

코드로 확인

 

of,ofNullable,get,orElse,orElseGet,orElseThrow를 위에서 글로 설명했는데 코드로 직접보는게 훨씬 이해가 쉽다. Optional을 잘 사용하면 정말 강력한 기술이기때문에 코드에서 어떻게 사용되는지 확인해보자.

 

 

 

 

 

 

참고

 

Optional in Java SE 8

Java SE 8 added a new class to handle nullability - Optional - but when should it be used? Optional in Java SE 8 Optional is not a ne...

blog.joda.org

 

댓글