[Java] Optional Class
Optional<T>클래스는 Integer or Double 클래스처럼 T 타입의 객체를 포장해주는 래퍼 클래스다. ( Wrapper class) 따라서 Optional 인스턴스는 모든 타입의 참조변수를 저장할 수 있다.
Optional 객체를 사용하면 예상치 못한 NullPointException 예외를 제공되는 메서드로 회피할 수 있다. 즉, 조건문 없이 null값으로 인해 발생하는 예외를 처리할 수 있다.
Optional 객체 생성
of()메서드 또는 ofNullable() 메서드를 사용하여 Optional 객체를 생성할 수 있다.
- of() 메서드는 null이 아닌 값의 Optional 객체를 반환 // null이면 NullPointerException 발생
- ofNullable() 메서드는 null 이 아닌 값일 때 객체 반환 // null이면 비어있는 Optional 객체를 반환
Optional<String> opt = Optional.ofNullable("자바 Optional 객체");
System.out.println(opt.get());
Optional 객체에 접근
get() 메서드를 사용하면 Optional 객체에 저장된 값에 접근할 수 있는데, null일 경우 예외가 발생한다. 따라서 get()메서드를 호출하기 전에 isPresent() 메서드를 사용하여 Optional 객체에 저장된 값이 null 인지 아닌지를 먼저 확인한 후에 호출하는것이 옳다.
Optional<String> opt = Optional.ofNullable("자바 Optional 객체");
if(opt.isPresent()) {
System.out.println(opt.get());
}
1. orElse() : 저장된 값이 존재하면 그 값을 반환하고, 값이 존재하지 않으면 인수로 전달된 값을 반환함.
2. orElseGet() : 저장된 값이 존재하면 그 값을 반환하고, 값이 존재하지 않으면 인수로 전달된 람다 표현식의 값을 반환
3. orElseThrow() : 저장된 값이 존재하면 그 값을 반환하고, 값이 존재하지 않으면 인수로 전달된 예외를 발생시킴.
Optional<String> opt = Optional.empty(); // empty() 는 Optional를 null로 초기화함.
System.out.println(opt.orElse("빈 Optional 객체"));
System.out.println(opt.orElseGet(String::new));
기본 타입의 Optional 클래스
IntStream 클래스와 같이 기본 타입 스트림을 위함 별도의 Optional 클래스가 있다.
- 1. OptionalInt 클래스 = int getAsInt()
- 2. OptionalLong 클래스 =long getAsLong()
- 3. OptionalDouble 클래스 = double getAsDouble()
위 클래스들은 반환타입이 기본타입이라는것만 제외하면 Optional 클래스와 동일하다.
IntStream stream = IntStream.of(4, 2, 1, 3);
OptionalInt result = stream.findFirst();
System.out.println(result.getAsInt());
//
4
Optional 메서드
메소드 | 설명 |
static <T> Optional<T> empty() | 아무런 값도 가지지 않는 비어있는 Optional 객체를 반환함. |
T get() | Optional 객체에 저장된 값을 반환함. |
boolean isPresent() | 저장된 값이 존재하면 true를 반환하고, 값이 존재하지 않으면 false를 반환함. |
static <T> Optional<T> of(T value) | null이 아닌 명시된 값을 가지는 Optional 객체를 반환함. |
static <T> Optional<T> ofNullable(T value) | 명시된 값이 null이 아니면 명시된 값을 가지는 Optional 객체를 반환하며, 명시된 값이 null이면 비어있는 Optional 객체를 반환함. |
T orElse(T other) | 저장된 값이 존재하면 그 값을 반환하고, 값이 존재하지 않으면 인수로 전달된 값을 반환함. |
T orElseGet(Supplier<? extends T> other) | 저장된 값이 존재하면 그 값을 반환하고, 값이 존재하지 않으면 인수로 전달된 람다 표현식의 결괏값을 반환함. |
<X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier) |
저장된 값이 존재하면 그 값을 반환하고, 값이 존재하지 않으면 인수로 전달된 예외를 발생시킴. |