Java 8부터 도입된 java.util.Optional<T> 클래스는 값이 존재하지 않을 수 있는 상황을 명시적으로 처리하기 위한 컨테이너이다. 이를 통해 복잡한 조건문 없이도 null값으로 인해 발생하는 예외를 처리할 수 있게되어 NullPointerException(NPE)을 방지하고 코드를 더욱 읽기 쉽게 작성할 수 있다. 또한 Integer나 Double 클래스처럼 'T' 타입의 제네릭 객체를 포장해주는 래퍼 클래스(Wrapper Class)로 Optional 클래스는 모든 타입의 참조 변수를 저장할 수 있다.
1. Optional 객체의 생성
Optional 객체를 생성하려면 of(), ofNullable(), empty() 등의 정적 팩토리 메서드를 사용할 수 있다.
정적 팩토리 메서드(Static Factory Method)
- 객체를 생성하는 정적 메서드로 일반적인 생성자 호출 대신, 클래스에서 제공하는 정적 메서드를 통해 객체를 생성하는 방식이다.
- Optional.of(T value) (static <T> Optional<T> of(T value))
- null이 아닌 값을 포함하는 Optional 객체를 생성한다.
- 만약 value가 null이면 NullPointerException을 발생시킨다.
- Optional.ofNullable(T value) (static <T> Optional<T> ofNullable(T value))
- 값이 null일 수 있는 경우에 사용하는 안전한 생성 메서드다.
- 값이 null이면 빈 Optional 객체를 반환하여, 만약 참조 변수의 값이 null이 될 가능성이 있다면 해당 메소드 사용하여 객체 생성하는 것이 좋다.
- Optional.empty() (static <T> Optional<T> empty())
- 값을 포함하지 않는 빈 Optional 객체를 생성한다.
import java.util.Optional;
public class OptionalExemple{
public static void main(String[] args){
Optional<String> opt1 = Optional.ofNullable("Optional 객체1");
System.out.println(opt1.get());
Optional<String> opt2 = Optional.ofNullable("Optional 객체2");
if(opt.isPresent()) {
System.out.println(opt2.get());
}
}
}
/*
실행 결과 :
Optional 객체1
Optional 객체2
*/
2. Optional 객체 접근 및 값 확인
Optional 객체에 접근하기 위해서는 get() 메서드를 사용한다. 만약 Optional 객체에 저장된 값이 null일 경우 NoSuchElementException 예외가 발생한다. 따라서 get() 메서드를 호출하기 전에 isPresent() 메서드를 사용하려 값이 존재하는지 여부를 먼저 확인하는 것이 좋다. Optional 객체에 값이 있을 경우 orElse()나 orElseGet() 메서드를 사용해 대체값을 제공할 수 있다.
- Optional.get() (T get())
- Optional 객체에 저장된 값을 반환한다.
- Optional.isPresent() (boolean isPresent())
- 저장된 값이 존재하면 true, 존재하지 않으면 false 반환한다.
- Optional.orElse() (T orElse(T other))
- 저장된 값이 존재하면 그 값을 반환하고, 값이 존재하지 않으면 인수로 전달된 값을 반환한다.
- Optional. orElseGet() (T orElseGet(Supplier other))
- 저장된 값이 존재하면 그 값을 반환하고, 값이 존재하지 않으면 인수로 전달된 람다 표현식의 결괏값을 반환한다.
- Optional. orElseThrow() (<X extends throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier))
- 지정된 값이 존재하면 그 값을 반환하고, 값이 존재하지 않으면 인수로 전달된 예외를 발생시킨다.
Optional<String> opt = Optional.ofNllable("Optional Exemple");
// 1. isPresent()로 값 확인
if(opt.isPresent()){
System.out.println(opt.get());
}else{
System.out.println("빈 Optional 객체");
}
/*
실행 결과: Optional Exemple
*/
// 2. 값이 없는 경우 처리
Optional<String> emptyOpt = Optional.empty(); //빈 객체로 초기화
System.out.println(emptyOpt.orElse("빈 Optional 객체 1"));
System.out.println(emptyOpt.orElseGet(()-> "빈 Optional 객체 2"));
try{
emptyOpt.orElseThrow(() -> new IllegalArgumentException("값 없음"));
}catch(IllegalArgumentException e){
System.out.println(e.getMessage());
}
/*
실행 결과:
빈 Optional 객체 1
빈 Optional 객체 2
값 없음
*/
3. 값 변환 (map) 및 필터링 (filter)
Optional 객체는 다른 메서드들과 연결하여 사용할 수 있다. 스트림 API와 유사한 방식으로 값을 변환하거나 필터링할 수 있어, map() 메서드 사용하여 Optional 객체의 값을 변환하거나 filter()메서드를 사용하여 Optional 객체의값을 검사할 수 있다.
Optional<String> optName = Optional.of("abcd");
// 1. map으로 값 확인
Optional<Integer> nameLength = optName.map(s->s.length);
nameLength.ifPresent(len -> System.out.println("이름 길이: " + len));
/*
실행 결과:
이름 길이: 4
*/
// 2. filter로 값 조건 검사
optName.filter(name -> name.startsWith("a"))
.ifPresent(name -> System.out.println("이름 : " + name));
/*
실행 결과:
이름 : abcd
*/
[출처: https://ccomccomhan.tistory.com/127, https://www.tcpschool.com/java/java_stream_optional]
'Programming Language > Java' 카테고리의 다른 글
[java] 클래스 정보 가져오기 (0) | 2025.04.08 |
---|---|
[Java/개념] 정적 팩토리 메서드 (0) | 2024.12.10 |
[Java/개념] Java 예외 처리(Exception Handling) (1) | 2024.12.05 |
[Java/개념] Math, Random (0) | 2024.12.05 |
[Java/개념] API)String, StringTokenizer, StringBuffer, StringBuilder (0) | 2024.12.05 |