Optional 클래스란?
- Optional<T> 클래스는 Integer나 Double 클래스처럼 ‘T’타입의 객체를 포장해 주는 래퍼 클래스 (Wrapper class)
- Optional 인스턴스는 모든 타입의 참조 변수를 저장할 수 있다.
- Optional 객체를 사용하면 예상치 못한 NullPointerException 예외를 제공되는 메소드로 간단히 회피할 수 있다.
- 복잡한 조건문 없이도 null 값으로 인해 발생하는 예외를 처리할 수 있게 된다.
Optional 객체의 생성
- 메소드
- of() 메소드
- null이 아닌 명시된 값을 가지는 Optional 객체를 반환한다.
- of() 메소드를 통해 생성된 Optional 객체에 null이 저장되면 NullPointerException 예외가 발생한다.
- ofNullable() 메소드
- 명시된 값이 null이 아니면 명시된 값을 가지는 Optional 객체를 반환한다.
- 명시된 값이 null이면 비어있는 Optional 객체를 반환한다.
- of() 메소드
- 참조 변수의 값이 만에 하나 null이 될 가능성이 있다면, ofNullable() 메소드를 사용하여 Optional 객체를 생성하는 것이 좋다.
- 사용 예시
Optional 객체에 접근
- get() 메소드를 사용하면 Optional 객체에 저장된 값에 접근할 수 있다.
- Optional 객체에 저장된 값이 null이면, NoSuchElementException 예외가 발생합니다.
- get() 메소드를 호출하기 전에 isPresent() 메소드를 사용하여
Optional 객체에 저장된 값이 null인지 아닌지를 먼저 확인한 후 호출하는 것이 좋다. - 사용 예시
Null에 대한 대체값 지정하기
- 메소드
- orElse() 메소드
- 저장된 값이 존재하면 그 값을 반환한다.
- 값이 존재하지 않으면 인수로 전달된 값을 반환한다.
- orElseGet() 메소드
- 저장된 값이 존재하면 그 값을 반환한다.
- 값이 존재하지 않으면 인수로 전달된 람다 표현식의 결괏값을 반환한다.
- orElseThrow() 메소드
- 저장된 값이 존재하면 그 값을 반환한다.
- 값이 존재하지 않으면 인수로 전달된 예외를 발생시킨다.
- orElse() 메소드
- 사용 예시
기본 타입의 Optional 클래스
- Java에서는 기본 타입 스트림을 위한 별도의 Optional 클래스를 제공한다.
- Optional 객체에서 get() 메소드를 사용하여 저장된 값에 접근할 수 있는 것처럼
클래스별로 저장된 값에 접근할 수 있는 다음과 같은 메소드를 제공한다.
클래스 | 저장된 값에 접근하는 메소드 |
---|---|
Optional<T> | T get() |
OptionalInt | int getAsInt() |
OptionalLong | long getAsLong() |
OptionalDouble | double getAsDouble() |
Optional 메소드
메소드 | 설명 |
---|---|
static | 아무런 값도 가지지 않는 비어있는 Optional 객체를 반환한다. |
T get() | Optional 객체에 저장된 값을 반환한다. |
boolean isPresent() | 저장된 값이 존재하면 true를 반환하고, 값이 존재하지 않으면 false를 반환한다. |
static | null이 아닌 명시된 값을 가지는 Optional 객체를 반환한다. |
static | 명시된 값이 null이 아니면 명시된 값을 가지는 Optional 객체를 반환하며, 명시된 값이 null이면 비어있는 Optional 객체를 반환한다. |
T orElse(T other) | 저장된 값이 존재하면 그 값을 반환하고, 값이 존재하지 않으면 인수로 전달된 값을 반환한다. |
T orElseGet(Supplier<? extends T> other) | 저장된 값이 존재하면 그 값을 반환하고, 값이 존재하지 않으면 인수로 전달된 람다 표현식의 결괏값을 반환한다. |
저장된 값이 존재하면 그 값을 반환하고, 값이 존재하지 않으면 인수로 전달된 예외를 발생시킨다. |