코딩마을방범대

Optional에 대하여 본문

💡 백엔드/Java

Optional에 대하여

신짱구 5세 2023. 7. 25. 14:58
728x90

 

 

Optional에 대하여

  • Object를 리턴하는데 null일 가능성이 있다면 Optional로 래핑하는 것을 권장
  • 매핑 함수의 적용 결과가 null인 경우 빈 Optional을 반환(메소드를 체이닝했을 때 중간에 null이 있어도 빈 Optional로 계속해서 이어나갈 수 있음)

메소드체이닝이란?
메소드를 줄줄이 엵어서 메소드를 계속해서 사용할 수 있게끔 하는 방법
setter() 메소드에서 void가 아닌 세팅된 객체를 리턴

 

 


 

 

map과 flatmap

  • A type을 B type으로 바꾼다는 뜻(매핑)
  • Optional의 값이 있는 경우에만 실행
map 결과를 Optional로 감싸서 리턴
flatmap 감싸지 않고 반환

 

 

 


 

 

orElse와 orElseGet 의 차이점

 

구분 설명
orElse() 내부 객체의 상태와 상관없이 무조건 실행
Optional 내부 객체가 not null이라서 orElse가 결과값을 반환하지는 않더라도 실행됨
orElseGet() 객체가 null인 경우에만 실행

 

 

 


 

 

orElseThrow 란

  • 값이 없다면 에러를 발생시킬 수 있는 메소드
obj.orElseThrow(() -> new Exception("throw exception"));

isPresent 란

  • 값이 있는지 없는지 확인할 수 있는 메소드
findById(4).ifPresent((user) -> System.out.println(user.getName()));

 

 

 


 

 

 

 

 

Optional 사용 시 주의할 점

 

 

1. Optional 변수에 null 할당 금지

  • 반환 값으로 null을 사용하는 것이 위험하기 때문에 등장한 것이 Optional이므로
    Optional.empty()(내부 값을 null로 초기화한 싱글턴 객체) 메서드를 사용해야 함
  • 빈 Optional 객체에 get() 메서드를 호출한 경우 NoSuchElementException이 발생하기 때문에 orElse 메소드를 사용

 

 


 

 

2. 원시 타입의 Optional에는 OptionalInt, OptionalLong, OptionalDouble 사용을 고려할 것

  • 원시 타입(primitive type)을 Optional로 사용해야 할 때는 박싱과 언박싱을 거치면서 오버헤드가 생기게 되므로
    Optional의 제네릭 타입에 맞춰야 하는 경우가 아니라면, int, long, double 타입에는 OptionalXXX 타입 사용을 고려하는 것이 좋음
OptionalInt maybeInt = OptionalInt.of(2);
OptionalLong maybeLong = OptionalLong.of(3L);
OptionalDouble maybeDouble = OptionalDouble.empty();

 

 


 

 

3. 값에 대해 미리 정의된 규칙(제약사항)이 있는 경우에는 filter 사용을 고려할 것

  • 인자로 전달된 predicate이 참인 경우에는 기존의 내부 값을 유지한 Optional이 반환되고, 그렇지 않은 경우에는 비어 있는 Optional을 반환
Optional.ofNullable(username)
   .filter(this::isOverLength)
   .isPresent();

 

 

 

 

 


참고사이트

Optional 제대로 활용하기

Optional 사용 방법

 

 

728x90