자바 옵셔널 (Java Optional)
Optional이란?
- 비어있을 수도 있고, 값을 단 하나만 담고있을 수 있는 컨테이너
Optional이 존재하지 않던 시절의 null 처리
- 자바는 참조할 객체가 없는 경우에 null이 반환된다
- null을 방지하기 위해, 반환값에 수동으로 null검사를 해왔는데, 굉장히 잊어버리기 쉽고 코드도 지저분하다
- null이 발생할 경우 보통은 예외처리를 하게 되는데, 예외처리 과정의 스택 트레이스 과정에서 부하가 크고, 진짜 예외일 때만 처리한다는 법칙에 어긋난다
if (data == null) { // 반환값 검사
throw new Exception(e); // 예외처리
}
Optional이 생기게 된 이유
Optional 문법
반환하기
// Primitive Type
OptionalInt 메서드명() {
return OptionalInt.of(반환변수);
}
// 제네릭
Optional<제네릭> 메서드명() {
return Optional.ofNullable(반환변수); // null이 가능한 변수를 반환
}
Optional<제네릭> 메서드명() {
return Optional.of(반환변수); // null이 불가능한 변수를 반환
}
반환받은값 사용하기
// 존재 확인
optionalObject.isPresent();
// 참일 경우 실행됨
optionalObject.isPresent(oc -> System.out.println(oc.getTitle()));
// 비어있는지 확인
optionalObject.isEmpty()
// 데이터 받아오기 : get
// 비어있는 Optional에서 get을 사용하면 Runtime Error 발생!
데이터타입 obj = optionalObject.get();
// 데이터 받아오기 :orElse
// orElse 내의 함수는 반드시 실행됨
데이터타입 obj = optionalObject.orElse(createNewClass());
private static 데이터타입() {
return new 데이터타입();
}
// 데이터 받아오기 : orElseGet
// 괄호 안에 supplier 함수형 인터페이스가 들어가는데, 이는 Lazy Execution이므로 없을 때만 실행됨
데이터타입 obj = optionalObject.orElseGet(데이터타입::new);
// orElseThrow
//
Toy myToy = max(toys).orElseThrow(TemperTeantrumException::new);
Optional을 반환하는 함수를 stream에 사용하기
Optional 사용시 주의사항