Java

Optional 클래스

Sol b 2023. 8. 17. 15:13

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()
);