Java8에서 부터 Optional 클래스를 지원한다.
NPE란?
optional을 알아보기전에 npe는 null point exception의 줄인말로 개발할 때 자주 볼 수 있는 예외이다.
이러한 npe가 발생하는 것을 방지하기 위해 Null 검사하는 로직을 추가해주는데 그렇게되면 코드가 길어지고 복잡해질 수 있다. 따라서 null 값을 체크해주기 위해 optional 을 사용한다.
Optional이란?
Java8에서 Optional<T> 클래스를 사용해서 npe(null point exception)을 방지할 수 있도록 해준다. option<T>는 null이 올 수 있는 값을 감싸는 wrapper 클래스로, 참조하더라도 npe가 발생하지 않도록 도와준다. Optional 클래스는 아래와 같이 value에 값을 저장해서 null이 오더라도 바로 npe를 발생하지 않게하며 클래스이기 때문에 각종 메소드를 제공한다.
public final class Optional<T> {
private final T value;
...
}
Optional을 사용하면
- NPE를 발생할 수 있는 null을 직접 다루지 않아도 된다.
- 번거롭게 null을 직접 체크하지 않아도 된다.
- 명시적으로 해당 변수가 null값이 올 수도 있다는 가능성을 표현할 수 있다.
Optional 사용법
그럼 java.util.Optional<T> 클래스를 어떻게 사용할까?
1) Optional 변수 선언하기
Optional<Order> maybeOrder;
Optional<String> tmpStr;
Optional<Address> address;
2) Optional 객체 생성하기
optional 클래스는 간편하게 객체를 생성 할 수 있도록 3가지 정적 팩토리 메소드를 제공한다.
optional.empty()
Optional<String> test = Optional.empty();
System.out.println(test); //test.empty
System.out.println(optional.isPresent()); //false
빈 객체는 위와 같이 생성할 수 있다.
Optional.of(value)
null이 아닌 객체를 담고있는 Optional 객체를 생성한다. null이 넘어오면 npe를 던지기 때문에 주의해야한다.
Optional<String> test = Optional.of(testOption);
Optional.ofNullable(value)
null인지 아닌지 확신할 수 없는 개체를 담고있는 Optional 객체를 생성한다.
null이 넘어오는 경우 npe를 던지지않고 Optional.empty()와 동일하게 비어있는 Optional 객체를 얻어온다. 해당 객체가 null인지 아닌지 확신이 없을 경우 이 메소드를 사용한다.
Optional<Member> maybeMember = Optional.ofNullable(aMember);
Optional<Member> maybeNotMember = Optional.ofNullable(null);
String name = optional.orElse("anonymous"); // 값이 없다면 "anonymous" 를 리턴
Optional이 담고있는 객체에 접근하기
Optional 클래스는 담고 있는 객체를 꺼내오기 위해서 다양한 인스턴스 메소드를 제공한다. 아래 메소드 모두 optional이 담고 있는 객체가 존재할 경우 동일하게 해당 값을 반환한다. 그러나 optional에 null을 담고있는 경우 다르게 동작한다.
- get()
- 비어있는 optional 객체에 대해서 npe 반환
- 따라서 객체 존재여부를 bool 타입으로 반환하는 isPresent() 메소드로 null 체크 필요
- orElse(T other)
- 비어있는 optional 객체에 대해서 넘어온 인자를 반환
- orElseGet(Supplier<? extends T> other)
- 비어있는 optional 객체에 대해서 넘어온 함수형 인자를 통해 생성된 객체를 반환
- orElse와 유사하나 비어있는 경우에만 함수가 호출 됨
- orElseThrow(Supplier<? extends X> exceptionSupplier)
- 비어있는 optional 객체에 대해서 넘어온 함수형 인자를 통해 생성된 예외를 반환
참고:
https://mangkyu.tistory.com/70
https://www.daleseo.com/java8-optional-after/
댓글