개발/JAVA

Java Optional 사용방법

라니킴 2022. 2. 14. 13:17

1. Optional이란?

모든 타입의 객체를 감싸는 래퍼 클래스로 JDK1.8부터 추가되었다.

 

1. 1  Optional을  사용하는 이유

  1. Optional 객체에 담아서 반환을 하면, 반환된 결과가 null 인지 매번 if 문으로 체크하는 대신 Optional에 정의된 메서드를 통해서 간단히 처리를 할 수 있다.
  2. 널 체크를 위한 if 문 없이도 NullPointerException이 발생하지 않는 보다 간결하고 안전한 코드를 작성하는 것이 가능하다.
Review reviews = reviewRepository.findAllById(reviewId);

만약 reviews를 조회했을 때 결과값이 없다면 NullPointerException이 발생하기 때문에 이 부분에 대해서 예외처리가 필요하다. 

 

1.2 Optinal<T> 객체 생성하기

  • of() 또는 ofNullable() 사용한다. 
    • 만일 참조변수의 값이 null일 가능성이 있으면, of() 대신 ofNullable()을 사용해야 한다.
    • of()는 매개변수의 값이 null이면 NullPointerException이 발생한다.
  Optional<List<Movie>> movieList1 = Optional.of(movieList);

// 참조변수의 값이 null 일 가능성이 있으면
  Optional<List<Movie>> movieList1 = Optional.ofNullable(movieList);
  • 기본값으로 초기화 할 때는 empty() 사용
Optional<List<Movie>> movieList2 = Optional.<List<Movie>>empty(); //빈 객체로 초기화

1. 3 Optional<T> 객체 값 가져오기

get()/orElse()/orElseGet / orElseThrow()

  • get() :  값이 null 일 때는 NoSuchElementException이 발생하며, 이를 대비해서 orElse()로 대체할 값을 지정할 수 있다. 
Optional<String> optVal = Optional.of(new String("abc"));

String str1 = optVal.get(); // null이면 예외발생

String str2 = optVal.orElse(" "); // optVal에 저장된 값이 null일 때는, ""를 반환
  • orElseGet() : null을 대체할 값을 반환하는 람다식 지정 가능
  • orElseThrow() : 지정된 예외를 발생시킬 수 있다. 
String str1 = optVal.orElseGet(String::new); // () -> new String() 과 동일
String str2 = optVal.orElseThrow(NullPointerException::new) // null이면 예외발생
  • isPresent() : optinal객체의 값이 null이면 false, 아니면 true 를 반환한다.
  • ifPresent() : 값이 있으면 주어진 람다식을 수행하고, 없으면 아무 일도 하지 않는다. 
 Optional<List<Movie>> movieList = Optional.ofNullable(movieList);
if(movieList != null) {
   System.out.println("검색 결과가 없습니다. ");
 }
 
// isPresent() 사용
if (movieList.isPresent()) {
    System.out.println(str);
 }
 
// ifPresent() 사용해서 더 간단히 작성 가능하다. str이 null 이 아닐때만 출력
movieList.ifPresent(System.out::println)