JAVA Optional 이란?
Java Optional 클래스는 Java 8에서 추가되었으며 자바의 고질적인 문제인 NPE (NullpointerException) 문제 해결 가이드를 제공, 메서드가 반환할 결과값이 ‘없음’을 명백하게 표현할 필요가 있고, Null을 반환하면 에러를 유발할 가능성이 높은 상황에서 메서드의 반환 타입으로 Optional을 사용하자는 것이 Optional을 만든 주된 목적.
1. Optional.of
- value가 null일 경우 NPE 예외를 반환, 반드시 값이 있어야 하는 객체인 경우에만 해당 메서드를 사용
/**
* Returns an {@code Optional} with the specified present non-null value.
*
* @param <T> the class of the value
* @param value the value to be present, which must be non-null
* @return an {@code Optional} with the value present
* @throws NullPointerException if value is null
*/
public static <T> Optional<T> of(T value) {
return new Optional<>(value);
}
String data = "hello";
Optional<String> opt = Optional.of( data );
2. Optional.ofNullable
- value가 null인 경우 비어있는 Optional을 반환.(Optional.empty) 값이 null 일 수도 있는 객체인 경우 사용
/**
* Returns an {@code Optional} describing the specified value, if non-null,
* otherwise returns an empty {@code Optional}.
*
* @param <T> the class of the value
* @param value the possibly-null value to describe
* @return an {@code Optional} with a present value if the specified value
* is non-null, otherwise an empty {@code Optional}
*/
public static <T> Optional<T> ofNullable(T value) {
return value == null ? empty() : of(value);
}
String data = null;
Optional<String> opt = Optional.ofNullable( data );
3. Optional.empty
- 비어있는 옵셔널 객체를 생성( 객체는 생성되었지만, 값을 가지고 있지 않다.) 조건에 따라 분기를 태워야 하거나 반환할 값이 없는 경우 사용
/**
* Returns an empty {@code Optional} instance. No value is present for this
* Optional.
*
* @apiNote Though it may be tempting to do so, avoid testing if an object
* is empty by comparing with {@code ==} against instances returned by
* {@code Option.empty()}. There is no guarantee that it is a singleton.
* Instead, use {@link #isPresent()}.
*
* @param <T> Type of the non-existent value
* @return an empty {@code Optional}
*/
public static<T> Optional<T> empty() {
@SuppressWarnings("unchecked")
Optional<T> t = (Optional<T>) EMPTY;
return t;
}
4. Optional<T> 중간 처리
- Optional 객체를 생성한 후 사용 가능한 메서드, 해당 메서드들은 기능 동작 후 자기 자신(Optional)을 반환하므로 메서드 체이닝을 통해 원하는 로직을 반복 삽입하여 사용 가능
- filter : predicate 값이 참이면 해당 필터를 통과시키고 거짓이면 통과 되지 않음.
- map : mapper 함수를 통해 입력값을 다른 값으로 변환하는 메서드.
- flatMap : mapper 함수를 통해 입력값을 다른 값으로 변환하는 메서드. map() 메서드와 다른 점은 메서드 시그니처의 매개변수. 제네릭 U에서 Optional(U)로 정의
5. Optional<T> 종단 처리
- 종단처리 라 함은 Optional 객체의 체이닝을 끝낸다는 의미이다.
- ifPresent : 최종적으로 연산을 끝낸 후 값이비어있지 않다면 인자값으로 넘긴 함수를 실행하는 메서드. 중간 연산을 수행 중 Optional 객체가 null인 객체를 받게 되면 해당 메서드의 내용을 수행하지 않음.
- isPresent : 최종적으로 연산을 끝낸 후 객체가 존재하는지 여부를 판별 ( 반환 값 boolean 형 )
- get : 최종적으로 연산을 끝낸 후 객체를 반환. 이 때 비어있는 옵셔널 객체였다면 NoSuchElementException 예외 발생
- orElse : 최종적으로 연산을 끝낸 후에도 옵셔널 객체가 비어 있다면 기본 값으로 제공할 객체를 지정한다.
- orElseGet : 최종적으로 연산을 끝낸 후에도 옵셔널 객체가 비어 있다면 기본 값으로 제공할 공급자 함수(supplier) 를 지정한다.
- orElseThrow : 최종적으로 연산을 끝난 후에도 옵셔널 객체가 비어 있다면 예외 공급자 함수를 통해 예외를 발생시킨다.
String name = "SangHyun";
// ifPresent
Optional.ofNullable(name).ifPresent( s -> System.out.println(s) );
// isPresent
if( Optional.ofNullable(name).isPresent() ) {
// data exists
}
// get
Optional.ofNullable(name).get() // SangHyun return
// orElse
Optional.ofNullable(name).orElse("Optional2");
// orElseGet
Optional.ofNullable(name).orElseGet( this ::getDefaultValue );
// orElseThrow
try {
Optional.ofNullable(name).orElseThrow( NoSuchElementException :: new );
} catch ( NoSuchElementException e ) {
System.out.println( e );
}
6. orElse / orElseGet 사용 시 주의점!
- orElse 메서드는 옵셔널 객체가 비어있든 비어있지 않든 반드시 실행.
- orElseGet 메서드는 옵셔널 객체가 비어있으면 실행. 비어있지 않을 경우는 실행안함.
- 옵셔널 객체의 null 여부에 따른 기본 값을 주고자 할 때에 기본값을 구하는 과정이 오래 걸린다면 orElseGet 메서드를 사용해야 한다.
'Java' 카테고리의 다른 글
[Java] 암호 알고리즘 / 운용 모드 / Padding (0) | 2020.11.28 |
---|---|
[Java] Reflection (0) | 2020.11.19 |
[Java] CPU 점유율이 높은 스레드 상태 분석(Thread dump) (0) | 2020.11.10 |
[Java] Lombok (0) | 2020.10.20 |
[Java] PriorityBlockingQueue (0) | 2020.10.05 |