-
java.util.Optional<T> 클래스
Optional<T> 클래스는 Integer나 Double 클래스처럼 'T'타입의 객체를 포장해주는 래퍼 클래스(Wrapper class)이다. 따라서 Optional 인스턴스는 모든 타입의 참조 변수를 저장할 수 있다.
이러한 Optional 객체를 사용하면 예상치 못한 NullPointerException 예외를 제공되는 메소드로 간단히 회피할 수 있다. 즉, 복잡한 조건문 없이도 널(null) 값으로 인해 발생하는 예외를 처리할 수 있게 된다.* Wrapper class(래퍼 클래스)란?
기본 타입에 해당하는 데이터를 객체로 포장해 주는 클래스를 래퍼 클래스(Wrapper class)라고 한다. 래퍼 클래스는 각각의 타입에 해당하는 데이터를 인수로 전달받아, 해당 값을 가지는 객체로 만들어 준다.
1. Optional 객체는 of() 메소드나 ofNullable() 메소드를 사용해서 생성할 수 있다.
- empty() : null을 가지는 비어있는 Optional 객체를 반환한다. 이 객체는 Optional 내부적으로 미리 생성해놓은 싱글톤 인스턴스이다.
- of() : null이 아닌 명시된 값을 가지는 Optional 객체를 반환한다. of() 메소드를 통해 생성된 Optional객체에 null이 저장되어 있으면 NullPointerException 예외가 발생한다.
- ofNullable() : 명시된 값이 null이 아니면 명시된 값을 가지는 Optional 객체를 반환하고 null이면 비어있는 Optional 객체를 반환한다.
Optional<String> opt = Optional.ofNullable("Optional");
System.out.println(opt.get());
[결과] : Optional2. Optional 객체에 저장된 값은 get() 메소드를 사용해서 접근할 수 있다.
- Optional 객체에 null이 저장되어 있으면 NoSuchElementException 예외가 발생한다. 따라서 isPresent() 메소드를 사용해서 저장된 값이 null인지 아닌지 먼저 확인하는 것이 좋다.
Optional<String> opt = Optional.ofNullable(null);
System.out.println(opt.get());
[결과] java.util.NoSuchElementException: No value present
Optional<String> opt = Optional.ofNullable();
if(opt.isPresent()) {
System.out.println(opt.get());
}
[결과] :
Optional<String> opt = Optional.ofNullable("Optional");
if(opt.isPresent()) {
System.out.println(opt.get());
}
[결과] : Optional3. null 값을 대신해 대체할 값을 지정할 수 있다.
- orElse(T other) : 저장된 값이 존재하면 그 값을 반환하고, 값이 존재하지 않으면 인수로 전달된 값을 반환한다.
- orElseGet(Supplier<? extends T> other) : 저장된 값이 존재하면 그 값을 반환하고, 값이 존재하지 않으면 인수로 전달된 람다 표현식의 결괏값을 반환한다. Optional 객체가 비어있는 경우에만 호출되기 때문에 orElse() 와 비교하여 성능상의 이점이 있을 수 있다.
- orElseThrow(Supplier<? extends X> exceptionSupplier) : 저장된 값이 존재하면 그 값을 반환하고, 값이 존재하지 않으면 인수로 전달된 예외를 발생시킨다.
String name = "Optional";
String result= Optional.ofNullable(name).orElse(getName());
System.out.println(result);
[결과] : Optionalname= null;
result = Optional.ofNullable(name).orElseGet(this::getName);System.out.println(result);
[결과] : new Optional
name = null;result = Optional.ofNullable().orElseThrow(NoSuchElementException::new).toUpperCase();
[결과] : java.util.NoSuchElementException: nullpublic String getUserEmail() {
System.out.println("call getName()");
return "new Optional";
}
4. 자바에서는 기본 타입 스트림을 위한 별도의 Optional 클래스를 제공한다.
- OptionalInt 클래스
- OptionalLong 클래스
- OptionalDouble 클래스
위의 클래스로 생성된 객체는 각각 getAsXXX() 메소드로 객체에 저장된 값에 접근할 수 있다.
IntStream stream = IntStream.of(10, 9, 5, 6);
OptionalInt result = stream.findFirst();
System.out.println(result.getAsInt());
[결과] : 10
Optional 메소드 정리
'STUDY > 백엔드' 카테고리의 다른 글
@Transactional (0) 2021.05.07 람다 표현식 (0) 2021.05.06 Stream (0) 2021.04.28 Spring Batch (0) 2021.03.03 메모리 영역 (0) 2021.02.08