Optional<T> 클래스는 Integer나 Double 클래스처럼 'T'타입의 객체를 포장해 주는 래퍼 클래스(Wrapper class)입니다.
따라서 Optional 인스턴스는 모든 타입의 참조 변수를 저장할 수 있습니다.
이러한 Optional 객체를 사용하면 예상치 못한 NullPointerException 예외를 제공되는 메소드로 간단히 회피할 수 있습니다.
즉, 복잡한 조건문 없이도 널(null) 값으로 인해 발생하는 예외를 처리할 수 있게 됩니다.
Optional.empty() VS null
Optional 클래스는 값이 없으면 Optional.empty 메서드로 Optional을 반환하빈다.
null을 참조하면 NullPointerException이 발생하지만
Optional.empty()는 Optional 객체이므로 이를 다양한방식으로 활용할 수 있습니다.
Optional 메서드
empty()
Optional<Car> car = Optional.empty(); // --Optional.empty
of()
null이 아닌 객체로 Optional클래스 만들기
Optional<Car> car1 = Optional.of(car);
ofNullable()
null객체로 Optional클래스 만들기
Optional<Optional<Car>> optionalCar1 = Optional.ofNullable(optionalCar); -- Optional[Optional.empty]
ifPresent()
값이 있다면 True 없다면 False를 반환합니다.
get()
Optional 안의 객체를 꺼내오는 과정입니다.
하지만 Optional이 비어있다면 NoSuchElementException이 발생하여 null을 사옹하는것과 별로 다를게 없어보입니다.
if (optionalCar.isPresent()) {
final Car car2 = optionalCar.get();
}
orElse()
저장된 값이 존재하면 그 값을 반환하고, 값이 존재하지 않으면 인수로 전달된 값을 반환합니다.
Car car2 = optionalCar.orElse(new Car());
orElseGet()
게으른 버전의 orElse() 입니다.
실제로 Optional에 값이 없을때만 지정된 디폴트 메서드를 만듭니다.
Car car2 = optionalCar.orElseGet(Car::new);
orElseThrow()
예외를 발생시킨다는 점에서Get과 비슷하지만
발생시킬 예외를 직접 지정할 수 있습니다.
Car car2 = optionalCar.orElseThrow(
() -> new RuntimeException()
);
'Java' 카테고리의 다른 글
HashMap, HashTable, ConcurrentHashMap (0) | 2023.08.22 |
---|---|
Java - 타입추론 Var (0) | 2023.08.17 |
StringBuffer, StringBuilder (0) | 2023.08.03 |
인터페이스와 추상클래스, Enum (0) | 2023.07.31 |
Pass by Value, Pass by reference (0) | 2023.07.27 |