꾸준히 기록하자

[Java] Optional Class 본문

IT/Java

[Java] Optional Class

seungwonlee 2023. 12. 14. 16:46
728x90

Optional 클래스는 Java8부터 지원하고 조건문 없이도 Optional에서 제공되는 메서드로 NPE 예외를 처리할 수 있지만 클래스를 사용했어도 null 체크를 하지 않으면 NoSuchElementException가 발생할 수 있습니다.

* NPE : NullPointerException

 

Optional 클래스는 무분별하게 사용하는 것보다 라이브러리 반환 타입인 경우에만 사용하시는 게 좋을 것 같습니다..

 

1. isPresent()

 - Optional 객체에 저장된 값이 null 인지 아닌지 확인 메서드

더보기
If a value is present, returns true, otherwise false.
Returns: true if a value is present, otherwise false
public boolean isPresent() {
    return value != null;
}

 

아래 코드블록은 isPresent() 예제입니다.

Optional<BoardEntity> optionalBoardEntity = boardRepositoryTests.findById(test);
if (optionalBoardEntity.isPresent()) {
    BoardEntity boardEntity = optionalBoardEntity.get();
}

Optional 객체 값이 null인데 isPresent() 메서드를 이용하지 않고 get() 메서드를 사용한다면 NoSuchElementException가 발생합니다.

 

2. empty(), of(), ofNullable()

 -  Optional 객체를 생성 메서드

 -  of()는 null 일 경우 NPE 발생하지만 ofNullable() 그대로 반환해 NPE 발생 안 하지 않습니다.

더보기
Returns an empty Optional instance. No value is present for this Optional.
Type parameters: <T> – The type of the non-existent value
Returns: an empty Optional
API Note: Though it may be tempting to do so, avoid testing if an object is empty by comparing with == against instances returned by Optional.empty(). 
	  There is no guarantee that it is a singleton. Instead, use isPresent().
public static<T> Optional<T> empty() {
    @SuppressWarnings("unchecked")
    Optional<T> t = (Optional<T>) EMPTY;
    return t;
}

Returns an Optional describing the given non-null value.
Params: value – the value to describe, which must be non-null
Type parameters: <T> – the type of the value
Returns: an Optional with the value present
Throws: NullPointerException – if value is null

public static <T> Optional<T> of(T value) {
    return new Optional<>(value);
}

Returns an Optional describing the given value, if non-null, otherwise returns an empty Optional.
Params: value – the possibly-null value to describe
Type parameters: <T> – the type of the value
Returns: an Optional with a present value if the specified value is non-null, otherwise an empty Optional

public static <T> Optional<T> ofNullable(T value) {
    return value == null ? empty() : of(value);
}

 

아래 코드블록은 빈 Optional 객체 생성 예제 코드입니다.

Optional<String> optional = Optional.empty();
// empty 결과: Optional.empty

아래 코드블록은 of(), ofNullable()의 예제코드입니다.

String val1 = "hi";
String val2 = null;
Optional<String> optional = Optional.ofNullable(val);
// val1 결과: Optional[hi]
// val2 결과: Optional.empty

null이 아닌 경우 of(), ofNullable()의 결괏값이 같습니다.

 

3. orElse(), orElseGet(), orElseThrow()

 -  null 대신에 대체할 값을 지정하는 메서드

 -  orElseGet(): 인수로 람다 표현식

더보기
If a value is present, returns the value, otherwise returns other.
Params: other – the value to be returned, if no value is present. May be null.
Returns: the value, if present, otherwise other
public T orElse(T other) {
    return value != null ? value : other;
}

If a value is present, returns the value, otherwise returns the result produced by the supplying function.
Params: supplier – the supplying function that produces a value to be returned
Returns: the value, if present, otherwise the result produced by the supplying function
Throws: NullPointerException – if no value is present and the supplying function is null
public T orElseGet(Supplier<? extends T> supplier) {
    return value != null ? value : supplier.get();
}

If a value is present, returns the value, otherwise throws NoSuchElementException.
Returns: the non-null value described by this Optional
Throws: NoSuchElementException – if no value is present
Since: 10
public T orElseThrow() {
    if (value == null) {
        throw new NoSuchElementException("No value present");
    }
    return value;
}

 

아래 코드블록은 orElse(), orElseGet() 예제 코드입니다.

@Test
void optional_test() {

    Optional<String> optional = Optional.empty();
    String testOp1 = optional.orElse(getInfo());
    String testOp2 = optional.orElseGet(() -> getInfo());
    System.out.println(testOp1);
    System.out.println(testOp2);
    // 실행
    // 실행
    // bye
    // bye
    
    optional = Optional.of("hi");
    String testOp3 = optional.orElse(getInfo());
    String testOp4 = optional.orElseGet(() -> getInfo());
    System.out.println(testOp3);
    System.out.println(testOp4);
    // 실행
    // hi
    // hi
}

private String getInfo() {
    System.out.println("실행");
    return "bye";
}

위 코드블록을 보시면 주의할 점은  Optional객체에 "hi" 값이 있는데 orElse의 getInfo()가 메서드가 호출되어  "실행" 이 찍혔다는 점인데 이유는 orElse(T other)의 매개변수를 getInfo() 메서드를 인수로 했기 때문입니다. 주의해서 사용하시면 될 거 같습니다.

 

끝.

반응형

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

[Java] java.util.Arrays copyOf, copyOfRange Method  (0) 2024.05.30
[Java] compareTo()  (0) 2023.09.12
[Java] Remove HTML tags  (0) 2023.04.13
[Java] Regular expression  (0) 2023.03.10
[Java] Call by Value & Reference  (0) 2023.01.15
Comments