Java

[Java] Optional

mxruhxn 2025. 1. 5. 14:22
728x90
반응형

Optional 클래스

java.util.Optional 클래스

  • Optional 클래스는 Integer나 Double 클래스처럼 'T'타입의 객체를 포장해 주는 Wrapper class
  • Optional 인스턴스는 모든 타입의 참조 변수를 저장할 수 있음.
  • Optional 객체를 사용하면 예상치 못한 NullPointerException 예외를 제공되는 메소드로 간단히 회피할 수 있음. 복잡한 조건문 없이도 널(null) 값으로 인해 발생하는 예외를 처리할 수 있게 됨.

Optional 객체 생성

of() 메소드나 ofNullable() 메소드를 사용하여 Optional 객체를 생성

  • of 메소드: null이 아닌 명시된 값을 가지는 Optional 객체를 반환. 만약, of() 메소드를 통해 생성된 Optional 객체에 null이 저장되면 NullPointerException 예외가 발생
    • 참조 변수의 값이 만에 하나 null이 될 가능성이 있다면, ofNullable() 메소드를 사용하여 Optional 객체를 생성하는 것이 좋음.
  • ofNullable 메소드: 명시된 값이 null이 아니면 명시된 값을 가지는 Optional 객체를 반환하며, 명시된 값이 null이면 비어있는 Optional 객체를 반환
Optional<String> opt = Optional.ofNullable("자바 Optional 객체");
System.out.println(opt.get());

Optional 객체 접근

  • get() 메소드를 사용하면 Optional 객체에 저장된 값에 접근할 수 있음.
  • 만약 Optional 객체에 저장된 값이 null이면, NoSuchElementException 예외가 발생
    • get() 메소드를 호출하기 전에 isPresent() 메소드 혹은 ifPresent()를 사용하여 Optional 객체에 저장된 값이 null인지 아닌지를 먼저 확인한 후 호출 필요
  • isPresent(): Optional 객체가 값을 가지면 true, 없다면 false를 리턴하는 Boolean 타입을 반환함.
  • ifPresent(): Optional 객체가 값을 가지고 있으면 실행, 값이 없으면 넘어감. void 타입 반환.
  • 또한, 다음과 같은 메소드를 사용하여 null 대신에 대체할 값 지정 가능.
    • orElse(): 저장된 값이 존재하면 그 값을 반환하고, 값이 존재하지 않으면 인수로 전달된 값을 반환
    • orElseGet(): 저장된 값이 존재하면 그 값을 반환하고, 값이 존재하지 않으면 인수로 전달된 람다 표현식의 결괏값을 반환
    • orElseThrow(): 저장된 값이 존재하면 그 값을 반환하고, 값이 존재하지 않으면 인수로 전달된 예외를 발생시킴
// isPresent() + Optional 객체
void optional_test() {
    String email = "test@test.com";

    Optional<User> user = userRepository.findByEmail(email);
    if(user.isPresent()) {
        System.out.println("이미 존재하는 이메일")
    } else System.out.println("사용 가능한 이메일!");
}
// ifPresent() + Optional 객체
void optional_test2() {
    Long idx = 4L;

    userRepository.findById(idx).ifPresent(a -> {
        throw new BadRequestException("이미 존재함!!");
    });

    System.out.println("없음!");
}

기본 타입의 Optional 클래스

  • 자바에서는 IntStream 클래스와 같이 기본 타입 스트림을 위한 별도의 Optional 클래스를 제공하고 있음.
    1. Optionalint 클래스
    2. OptionalLong 클래스
    3. OptionalDouble 클래스
  • 반환 타입이 Optional 타입이 아니라 해당 기본 타입이라는 사실만 제외하면 거의 모든 면에서 비슷함.
  • 또한, Optional 객체에서 get() 메소드를 사용하여 저장된 값에 접근할 수 있는 것처럼 클래스별로 저장된 값에 접근할 수 있는 다음과 같은 메소드를 제공
클래스 저장된 값에 접근하는 메소드
Optional T get()
OptionalInt int getAsInt()
OptionalLong long getAsLong()
OptionalDouble double getAsDouble()

 

IntStream stream = IntStream.of(4, 2, 1, 3);
OptionalInt result = stream.findFirst();

System.out.println(result.getAsInt()); // 4
728x90
반응형