“존재할 수도 있지만 안 할 수도 있는 객체”, 즉, “null이 될 수도 있는 객체”을 감싸고 있음
<T>타입 객체의 Wrapper class
모든 종류의 객체 저장 가능
간접적으로 null
을 다루기
null
관련 문제런타임에 Null Pointer Exception 예외 발생
if
문 사용하여 체크 → 코드 가독성과 유지 보수성 떨어짐
if (result != null) {}
NPE(Null Pointer Exception) 예외를 Optional이 제공하는 메소드로 간단하게 회피할 수 있다.
null
을 Optional
객체에 넣어 주소값을 갖게 됨
항상 null이 아니게 된다
NPE 발생 가능성이 없어짐
if문으로 null 체크 안해도 되니 코드가 간결해짐
String str = "";
빈문자열로 초기화 하는 등…String str = "abc";
Optional<String> optVal = Optional.of(str);
// 위 두개를 합치면
Optional<String> optVal = Optional.of("abc"); //null이 아닌 객체를 담음
Optional<String> optVal = Optional.of(null); // NPE 발생
Optional<String> optVal = Optional.ofNullable(null); // null인지 아닌지 확신X 객체 담음
Optional<String> optVal = null; // null로 초기화. 바람직하지 않음
Optional<String> optVal = Optional.<String>empty(); // 빈 객체로 초기화. null을 담음
// --------은 생략 가능
Optional 클래스는 객체 값 주는 다양한 인스턴스 메서드를 제공
비어있는 Optional 객체에 대해 (null일 경우)
get()
: NoSuchElementException
예외 발생. 그래서 잘 안씀orElse(T other)
: 넘어온 인자 반환.
orElse("")
인 경우 “ ” 반환orElseGet(Supplier < ? extends T> other)
: 넘어온 함수형 인자를 통해 생성된 객체 반환
orElseGet(String :: new)
람다식 사용으로 new String()
반환orElseThrow(Supplier < ? extends X> exceptionSupplier)
: 넘어온 함수형 인자를 통해 생성된 예외를 던짐
orElseThrow(NullPointerException::new)
널이면 예외 발생null 체크
isPresent()
Optional객체의 값이 null이면 false, 아니면 true를 반환
ifPresent(Consumer)
null이 아닐 때만 작업 수행. null이면 안함
자바8 Optional 1부: 빠져나올 수 없는 null 처리의 늪
[자바의 정석 - 기초편] ch14-35~39 Optional에 대한 강의입니다.