Java - Optional

TopOfTheHead·2025년 11월 27일

자바 ( JAVA )

목록 보기
19/23

Optional<T> : java.util.Optional
JAVA 8에서 등장하여 NPE ( NullPointerException ) 발생을 사전에 방지하고자 Null이 올 수 있는 값을 감싸는 Wrapper 클래스
Null 값이 도출되었을때, 예외 발생에 대한 대응을 위한 Final 클래스

Generic 클래스 이므로, Place Holder에는 Optional 객체어느 Type의 데이터를 저장해야 하는지 제약하여 타입안전성 확보
▶ 정의를 안하는 경우 get() 호출 시 Object Type으로 반환

Spring JPA메서드가 반환 시 주로 활용하는 Data type으로 Repository객체를 통해 CRUD를 수행 시 Optional 객체로 반환

  • Optional 사용 시 주의사항
    Optional메서드 반환타입으로 주로 명시.
    필드, 매개변수Optional을 직접 명시하는 것은 권장 X
 // 권장하지 않는 경우
class Member{
  private Optional<String> name;
  private void setName(Optional<String> name){ // } 
}
  // 권장하는 경우
public Optional<String> findMember(String id) // 권장 

Optional 객체를 생성하는 static 메소드

ex ) Optional<Integer> i = Optional.ofNullable(1)

  • Optional.empty()
    。값이 없는 Optional 객체 생성

  • Optional.of(데이터)
    Optional로 감쌀 데이터가 절대 Null이 아닌 경우 Optional 객체를 생성하는 메소드
    Optional.of(Null데이터)을 수행 시 NPE 발생

  • Optional.ofNullable(데이터)
    Optional로 감쌀 데이터Null이거나 아닐 수 있는 경우 Optional 객체를 생성하는 메소드

Optional 인스턴스 메소드

  • Optional객체.isPresent()
    Optional객체데이터의 존재여부( Null이 아닌 여부 )를 boolean으로 return
if (opt.isPresent()) {       // 상자 안에 값이 있나?
    String name = opt.get(); // 있으면 꺼내기
    System.out.println(name);
} else {
    System.out.println("없음");
}
  • Optional객체.orElseGet(람다식)
    Optional객체의 데이터가 null인 경우 람다식을 활용해 특정값으로 반환
    객체의 데이터가 null이므로 람다식 매개변수를 정의하지 않는다.

  • Optional객체.orElse(변수)
    Optional객체의 데이터가 Null인 경우 매개변수에 입력된 특정값을 반환
Optional<SomeClass> op1 = Optional.of(null); 
SomeClass output1 = op1.orElseGet(() -> new SomeClass(1));
SomeClass output2 = op1.orElse(new SomeClass(1)); 
  • Optional객체.ifPresent(람다식)
    Optional객체의 데이터를 포함하는 경우 내부 람다식을 실행하며 Null인 경우 실행되지 않음.
    Optional객체데이터가 존재하므로 람다식 매개변수를 정의하여 Optional객체의 데이터를 전달

    void로서 반환값이 없음
Optional<SomeClass> op = Optional.of(new SomeClass(1));
	op.ifPresent((obj)->{
		System.out.println(obj.age); // 1 출력
	});
  • Optional객체.ifPresentOrElse( null 아닌 경우 람다식 , null인 경우 람다식 ) :
    Optional 객체의 데이터가 null이 아닌 경우와 null인 경우 실행할 람다식을 모두 정의하여 2가지 경우를 모두 대응

    Optional 객체의 데이터가 존재하는 람다식은 매개변수를 정의하고 존재하지 않는 람다식은 매개변수를 정의하지 않는다.

    void로서 반환값이 없음
Optional<SomeClass> op1 = Optional.ofNullable(null);
op1.ifPresentOrElse((obj)->{
	System.out.println(obj.age); 
} , ()->{
	System.out.println("null"); // null 출력
});
  • Optional객체.orElseThrow(람다식)
    Optional 객체의 데이터가 Null 인 경우 람다식을 통해 Exception 객체를 return하여 예외throw
    ▶ 현업에서 제일 많이 사용하는 경우

    매개변수에 정의하는 람다식Exception 객체를 생성하여 return하도록 정의
    생성자참조를 통해 람다식을 축약할 수 있음
    Throwable 인터페이스 ( = 최상위 부모 )를 구현하는 Exception 클래스 객체를 생성하여 return 하도록 설정
Optional<SomeClass> op1 = Optional.ofNullable(null);
	op1.orElseThrow(()->{
		return new IllegalArgumentException();
	}); // IllegalArgumentException 발생
// 생성자참조로 람다식 축약
Optional<SomeClass> op1 = Optional.ofNullable(null);
op1.orElseThrow(IllegalArgumentException::new);
profile
공부기록 블로그

0개의 댓글