티스토리 뷰
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
와 같은 예외를 반환한다.
'Java+Spring > Java' 카테고리의 다른 글
[Java]자료구조 - 힙 트리(Heap Tree) (4) | 2022.09.28 |
---|---|
[Java]우선순위 큐(Priority Queue) 튜토리얼 (2) | 2022.09.23 |
[Java]instanceof 연산자 (0) | 2022.09.19 |
[Java]문자열, 문자열 배열에서 특정 값의 인덱스 구하기 indexOf(), lastIndexOf() (0) | 2022.08.25 |
[Java]멱집합(Power Set) (1) | 2022.08.01 |
[Java]유클리드 호제법, 최대공약수, 최소공배수 (0) | 2022.07.31 |
- Total
- Today
- Yesterday
- 백준
- BOJ
- 칼이사
- 세계일주
- 스프링
- RX100M5
- 자바
- 야경
- 유럽여행
- 알고리즘
- 지지
- 기술면접
- 남미
- 중남미
- 여행
- Python
- 면접 준비
- spring
- 맛집
- 파이썬
- 세모
- Backjoon
- 동적계획법
- java
- Algorithm
- 스트림
- a6000
- 유럽
- 세계여행
- 리스트
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |