개요
JAVA 8 버전부터 등장한 Optional<T>은 "T타입의 객체"를 감싸는 래퍼클래스다
Optional타입의 객체는 모든 타입의 참조변수를 담을 수 있다
특징
- 연산의 결과를 Optional객체에 담아서 반환
- Optional객체에 담아서 반환하면, 반환된 결과가 null인지를 if문으로 체크하지 않고 Optional의 메서드를 통해 처리할 수 있다
- NPE(NullPointerException)이 발생하지 않는 보다 간결하고 안전한 코드를 작성하는 것이 가능하다
*NPE : NullPointerException
Optional 객체 생성
1. Optional.of() : 값을 저장. 저장하는 값이 Null이면 NPE를 발생시킨다.
2. Optional.ofNullable() : 값을 저장. 저장하는 값이 Null이더라도 NPE가 발생하지 않는다.
3. Optional.empty() : Optional<T> 타입의 참조변수를 기본값으로 초기화할 때 사용 (Optional.empty)
String str = "abc";
Optional<String> optVal1 = Optional.of(str);
Optional<String> optVal2 = Optional.ofNullable(str);
Optional<String> optVal3 = Optional.empty();
Optional<String> optVal4 = Optional.of(null); // <- NPE
Optional 객체 값 가져오기
Optional 객체에 저장된 값을 가져오는 방법은 아래와 같이 다양하다
조회 방법 | 액션 |
get() | 저장된 값 가져오기. Null이면 NoSuchElementException 발생 |
orElse(T) | 저장된 값 가져오기. Null이면 T타입 변수로 대체 |
orElseGet(lambda) | 저장된 값 가져오기. Null이면 lambda가 반환하는 값 반환 |
orElseThrow() | 저장된 값 가져오기. Null이면 예외 발생 |
orElseThrow(lambda) | 저장된 값 가져오기. Null이면 커스텀 예외 발생 |
ifPresent(lambda) | 저장된 값이 있으면, 람다식 실행 |
ifPresentOrElse(lambda, Runnable) | 저장된 값이 있으면, 람다식 실행. 없으면 Runnable.run() 실행 |
람다식은 https://tosuccess.tistory.com/180?category=853908를 참고해주세요
Optional<String> optStr = Optional.ofNullable("str");
Optional<Integer> optNull = Optional.ofNullable(null);
System.out.println(optNull.get()); //NSE(NoSuchElementException)
System.out.println(optNull.orElse(1234)); //1234
System.out.println(optNull.orElseGet(() -> 5)); //5
System.out.println(optNull.orElseThrow()); //NSE(NoSuchElementException)
System.out.println(optNull.orElseThrow(NullPointerException::new)); //NPE
optStr.ifPresent(System.out::println); //str
optNull.ifPresentOrElse(System.out::print, new Runnable() { //?
@Override
public void run() {
System.out.println("?");
}
});
optNull.get()을 했을 때 NSE(NoSuchElementException)이란 예외가 뜨는데, 위에서 설명한 of()에서 뜨는 예외와 같은 예외가 아니다.
[예제]
아래와 같이 Optional클래스의 메서드를 사용하여 Null처리를 보다 쉽게 할 수 있다.
String str = "abc";
Optional<String> optStr = Optional.ofNullable("str");
if(str != null) { //1
System.out.println(str);
}
optStr.ifPresent(System.out::println); //2
//abc
//abc
Optional<T>에 대해 간단히 알아봤습니다. 다음에는 JAVA 8 버전에 추가된 스트림에서 Optional을 어떻게 활용하는지에 대해 알아보겠습니다.
[개인 공부를 위한 정리입니다. 참고용으로만 활용하세요]
Reference
Java의 정석 (남궁 성 지음)
반응형
'프로그래밍 언어 > JAVA(자바)' 카테고리의 다른 글
JAVA Exception 개념 (Checked Exception/UnChecked Exception/Error) (0) | 2024.02.13 |
---|---|
[자바/java] 자바 문자열 배열을 문자열로 변환하기/바꾸기 (반대 과정 포함) (0) | 2021.05.15 |
[자바/java] 람다식(Lambda) 정리하기 (4. 메서드 참조) (1) | 2021.05.10 |
[자바/java] 람다식(Lambda) 정리하기 (3. 람다식의 다양한 형태) (0) | 2021.05.07 |
[자바/java] 람다식(Lambda) 정리하기 (2. 함수형 인터페이스(Functional Interface) : 응용) (0) | 2021.04.15 |