[Java] Optional

2025. 1. 5. 14:22·Java
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
반응형

'Java' 카테고리의 다른 글

[Java] 스레드 동시성 문제  (0) 2025.01.06
[Java] 스레드의 생성 / 실행 / 제어 / 생명 주기  (0) 2025.01.06
[Java] Stream API  (0) 2025.01.05
[Java] Lambda Expression  (1) 2025.01.05
[Java] 자바 컬렉션 프레임워크  (0) 2025.01.04
'Java' 카테고리의 다른 글
  • [Java] 스레드 동시성 문제
  • [Java] 스레드의 생성 / 실행 / 제어 / 생명 주기
  • [Java] Stream API
  • [Java] Lambda Expression
mxruhxn
mxruhxn
소소하게 개발 공부 기록하기
    반응형
    250x250
  • mxruhxn
    maruhxn
    mxruhxn
  • 전체
    오늘
    어제
    • 분류 전체보기 (152)
      • Java (21)
      • Spring (6)
      • Database (13)
      • Operating Syste.. (1)
      • Computer Archit.. (0)
      • Network (24)
      • Data Structure (6)
      • Algorithm (11)
      • Data Infra (7)
      • DevOps (12)
      • ETC (27)
      • Project (21)
      • Book (1)
      • Look Back (1)
  • 블로그 메뉴

    • 링크

      • Github
    • 공지사항

    • 인기 글

    • 태그

    • 최근 댓글

    • 최근 글

    • hELLO· Designed By정상우.v4.10.0
    mxruhxn
    [Java] Optional
    상단으로

    티스토리툴바