티스토리 뷰

Java+Spring/Java

[Java]Optional<T>

Vagabund.Gni 2022. 9. 12. 22:12
728x90
반응형

Optional<T> 클래스는 자바 8부터 지원하는 래핑(Wrapping) 혹은 컨테이너(Container) 객체이다.

 

주로 NPE(Null Pointer Exception) 방지를 위해 사용되며, null이 올 수 있는 값을 감싸는 방법으로 기능한다.

 

또한 Integer나 Double과 같이 제네릭 타입(<T>)을 포장하기 때문에 모든 타입의 참조 변수를 저장할 수 있다.

 

NPE(Null Pointer Exception)

 

Exception in thread "main" java.lang.NullPointerException

NPE는 개발 중 가장 많이 발생하는 런타임 예외 중 하나로, 값이 없는(null) 대상을 호출할 때 발생하는 예외이다.

 

null의 의미가 모호해 디버깅이나 문제 파악이 어려우며, 예방을 위한 코드 역시 복잡하고 길게 늘어진다.

 

위와 같이 Optional 클래스를 이용해 null이 될 수도 있는 객체를 감싸면 다음과 같은 편리함을 얻을 수 있다.

 

  • NPE를 유발할 수 있는 객체를 직접 다루지 않아도 됨
  • null 체크를 직접 하지 않아도 됨
  • 해당 참조 객체 null 가능성을 명시 있음 → 불필요한 예방 코드를 줄일 있음

계속해서 Optional<T> 클래스의 기본 사용법에 대해 알아보자.

 

Creating Optional Objects

 

Optional 객체를 생성하는 메서드는 총 세 가지가 존재한다.

 

  • Optional.empty()
  • Optiional.of()
  • Optional.ofNullable()

Optional.empty() - Returns an Empty Optional Instance

 

Optional.empty()는 이름 그대로 비어있는 Optional 객체를 생성할 때 쓰인다.

Optional<String> optional = Optional.empty();

참고로 Optional<T> 클래스는 내부적으로 비어있는 객체를 미리 생성해 가지고 있으며,

 

호출시마다 같은 객체를 반환함으로써 메모리를 절약하고 있다.

public final class Optional<T> {
...
    
    private Optional() {
        this.value = null;
    }
    
...
}

 

Optional.of() - Returns an Optional Instance with the Specific non-null Value

 

Optional.of()는 값을 가지고 있는, 그러니까 null이 아닌 Optional 객체를 생성할 때 사용된다.

Optional<String> optional = Optional.of("Cat");

추가로 Optional.of()를 사용해 null을 저장하려고 하면 NPE가 발생한다.

 

Optional.ofNullable() - Returns an Optional Instance with/without a Value

 

Optional.ofNullable()null일 가능성이 있는 Optional 객체를 생성할 때 사용된다.

Optional<String> optional = Optional.ofNullable(getCats());

String cat = optional.orElse("No Cats"); // null인 경우 "No Cats" 리턴

위와 같이 객체를 생성한 후 orElse(defaultValue) 혹은 orElseGet(getFunction) 메서드를 이용해 null을 처리할 수 있다.

 

Examples

 

Optional<T> 클래스는 람다 표현식과 결합하면 코드를 획기적으로 줄일 수 있다.

 

기존의 복잡하고 긴 검증과정을 간단하게 표현할 수 있다는 뜻인데, 결과만 확인하자.

 

Example 1

 

List<String> catList = Optional.ofNullable(getCats())
    .orElseGet(() -> new ArrayList<>());

위 코드는 null 검증 후 새로운 리스트를 생성하는 코드이다.

 

어떤 역할을 하는 코드인지 직관적으로 파악이 가능하다.

 

Example2 - isPresent(), isEmpty()

 

Optional<String> opt = Optional.empty();
System.out.print(opt.isPresent());

// 실행 결과
false

isPresent()값이 존재하면 true를, 값이 존재하지 않으면 false를 반환한다.

Optional<String> opt = Optional.empty();
System.out.print(opt.isEmpty());

// 실행 결과
true

isEmpty()는 그와 반대로 값이 존재하면 false를, 값이 존재하지 않으면 true를 반환한다.

 

Example3 - ifPresent()

 

Optional<String> o = Optional.of("Learning Optional");
o.ifPresent((e) -> System.out.println(o.get()));

// 실행 결과
Learning Optional

ifPresent()는 값이 존재하는 경우에만 실행되는 로직을 매개변수로 갖는다.

 

Example4 - orElseThrow(Supplier)

 

Optional<String> o = Optonal.ofNullable(null);
o.orElseThrow(() -> new IllegalArgumentException("Empty Optional"));

// 실행 결과
Exception in thread “main” java.lang.IllegalArgumentException: Empty Optional

orElseThrow(Supplier)값이 존재하면 그 값을 반환하고, 존재하지 않으면 매개변수로 지정된 예외를 발생시킨다.

 

만약 orElseThrow()와 같이 매개변수를 지정해주지 않으면

Exception in thread “main” java.util.NoSuchElementException: No value present

와 같은 예외를 반환한다.

반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/06   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30
글 보관함