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을 잘 사용하면 정말 강력한 기술이기때문에 코드에서 어떻게 사용되는지 확인해보자.
참고
'Java' 카테고리의 다른 글
자바 - enum (0) | 2020.09.01 |
---|---|
Executor 인터페이스 (0) | 2020.08.22 |
이펙티브 자바 3,4,5장 - 인스턴스화 막기/의존 객체 생성자 주입/ 싱글톤 보장 (0) | 2020.08.06 |
인터페이스를 사용하는 이유 (2) | 2020.05.08 |
java - static 변수 (0) | 2020.05.07 |
댓글