본문 바로가기
Java/Basic

자바의 Optional 알아보기

by setung 2021. 11. 9.

자바는 참조변수에 기본적으로 null을 허용한다. 

 

상황에 따라 null을 사용할 수 있다는 것이 편리는 하지만 참조 변수를 안전하게 사용하기 위해선 null 체크가 필수다. null 체크를 하지 않으면 runtime중에 NullPointException이 언제 던져질지 모른다.

public void savePerson(Person person) {
        if(person == null)
            thorw new RuntimeException();
        
        repository.save(person);
}

보통 위와 같이 null 체크를 하게 되는데 코드를 지저분하게 만든다.

그래서 대체로 나온 것이 Optional이다.

Optional<T>은 Wrapper 클래스의 일종으로 값이 null일 수 있음을 알려준다.

 

 

Optional 생성

기본적으로 생성자는 private로 막아놨다. 대신 정적 팩토리 메서드를 제공한다.

  • Optional.empty() :  메서드는 Optional의 내부 value 값을 null로 생성한다.
  • Optional.of(value) :  인자를 통해 optional의 내부 value 값을 초기화한다. null을 인자로 받으면 NullPointerException 예외가 발생한다.
  • Optional.ofNullable(value) : of()와 같은데 null을 허용한다.

 

Optional 접근

Optional은 내부의 value를 접근하는 여러 메서드를 제공한다.

  • orElse(other) : Optional은 내부의 value를 반환하고, null이면 인자로 받은 other를 반환한다.
  • orElseGet(supplier) : Optional은 내부의 value를 반환하고, null이면 인자로 받은 람다식의 결과값을 반환한다.
  • orElseThrow() :  Optional은 내부의 value를 반환하고, null이면 예외를 던진다. 인자로 예외를 넣을 수 있다.
  • get() : Optional은 내부의 value를 반환하고, null이면 NoSuchElementException 예외를 던진다.

참고로 orElse()은 null이 아니더라도 미리 값을 준비 시킨다. 즉 인자로 메서드를 넣게 되면 메서드가 호출이 되는데 상황에 따라 문제가 될 수 있으니 주의해야 한다.

orElseGet()은 값이 null인 경우에만 람다식을 수행한다.

따라서 orElse()보단 orElseGet()를 사용하는 것이 좋겠다.

 

Optional 상태

  • isPresent() : value가 null이 아니면 true를 반환한다.
  • isEmpty() :  value가 null이면 true를 반환한다.

 

 

if(optional.isPresent()) {
   return optional.get();
}
else
   throw RuntimeException();

Optional에 대해 잘 몰랐을 때 위와 같이 코드를 작성했었다. 굳이 Optional을 사용할 필요가 없는 듯한다.

return optional.orElseThrow(() -> new RuntimeException());

하지만 옵셔널을 적절히 사용하면 위의 코드처럼 단순하게 표현이 가능해진다.

 

'Java > Basic' 카테고리의 다른 글

Java의 == 와 equals()  (0) 2022.01.14
ThreadLocal 이란  (0) 2021.11.01

댓글