Optional이란?
Optional는 “존재할 수도 있지만 안 할 수도 있는 객체”, 즉, “null이 될 수도 있는 객체”을 감싸고 있는 일종의 래퍼 클래스입니다.
원소가 없거나 최대 하나 밖에 없는 Collection이나 Stream으로 생각하셔도 좋습니다.
직접 다루기에 위험하고 까다로운 null을 담을 수 있는 특수한 그릇으로 생각하시면 이해가 쉬우실 것 같습니다.
Optional의 효과
Optional로 객체를 감싸서 사용하시게 되면
-
NPE를 유발할 수 있는 null을 직접 다루지 않아도 됩니다.
-
수고롭게 null 체크를 직접 하지 않아도 됩니다.
-
명시적으로 해당 변수가 null일 수도 있다는 가능성을 표현할 수 있습니다. (따라서 불필요한 방어 로직을 줄일 수 있습니다.)
Optional 객체 생성하기
Optional 클래스는 간편하게 객체 생성을 할 수 있도록 3가지 정적 팩토리 메소드를 제공합니다.
-
Optional.empty()
null을 담고 있는, 한 마디로 비어있는 Optional 객체를 얻어옵니다.
이 비어있는 객체는 Optional 내부적으로 미리 생성해놓은 싱글턴 인스턴스입니다.
Optional<Member> maybeMember = Optional.empty();
-
Optional.of(value)
null이 아닌 객체를 담고 있는 Optional 객체를 생성합니다.
null이 넘어올 경우, NPE를 던지기 때문에 주의해서 사용해야 합니다.
Optional<Member> maybeMember = Optional.of(aMember);
-
Optional.ofNullable(value)
null인지 아닌지 확신할 수 없는 객체를 담고 있는 Optional 객체를 생성합니다.
Optional.empty()와 Optional.of(value)를 합쳐놓은 메소드라고 생각하시면 됩니다.
null이 넘어올 경우, NPE를 던지지 않고 Optional.empty()와 동일하게 비어 있는 Optional 객체를 얻어옵니다.
해당 객체가 null인지 아닌지 자신이 없는 상황에서는 이 메소드를 사용하셔야 합니다.
Optional<Member> maybeMember = Optional.ofNullable(aMember);
Optional<Member> maybeNotMember = Optional.ofNullable(null);
Optional이 담고 있는 객체 접근하기
Optional 클래스는 담고 있는 객체를 꺼내오기 위해서 다양한 인스턴스 메소드를 제공합니다.
아래 메소드들은 모두 Optional이 담고 있는 객체가 존재할 경우 동일하게 해당 값을 반환합니다.
반면에 Optional이 비어있는 경우(즉, null을 담고 있는 경우), 다르게 작동합니다.
따라서 비어있는 Optional에 대해서 다르게 작동하는 부분만 설명드리겠습니다.
-
get()
비어있는 Optional 객체에 대해서, NoSuchElementException을 던집니다.
-
orElse(T other)
비어있는 Optional 객체에 대해서, 넘어온 인자를 반환합니다.
-
orElseGet(Supplier<? extends T> other)
비어있는 Optional 객체에 대해서, 넘어온 함수형 인자를 통해 생성된 객체를 반환합니다.
orElse(T other)의 게으른 버전이라고 보시면 됩니다.
비어있는 경우에만 함수가 호출되기 때문에 orElse(T other) 대비 성능상 이점을 기대할 수 있습니다.
-
orElseThrow(Supplier<? extends X> exceptionSupplier)
비어있는 Optional 객체에 대해서, 넘어온 함수형 인자를 통해 생성된 예외를 던집니다.
출처
- https://www.daleseo.com/java8-optional-before/
- https://www.daleseo.com/java8-optional-after/
- https://www.daleseo.com/java8-optional-effective/
'Back > Spring Java' 카테고리의 다른 글
제네릭(Generic) 문법 (0) | 2019.11.25 |
---|---|
Lombok - @Slf4j (0) | 2019.11.25 |
Lombok - @Builder, @Accessors 사용법 (0) | 2019.11.19 |
lombok 라이브러리 세팅(intelliJ) (0) | 2019.11.15 |
큰따옴표, 작은따옴표 차이 (0) | 2019.09.09 |