개발놀이터

자바 Optional 본문

Java

자바 Optional

마늘냄새폴폴 2021. 9. 23. 04:49

*Optional클래스
Optional<T> 클래스는 Integer나 Double 클래스처럼 'T'타입의 객체를 포장해주는 래퍼 클래스(Wrapper class)이다.
따라서 Optional클래스는 모든 타입의 참조 변수를 저장할 수 있다.

이러한 Optional 객체를 사용하면 예상치 못한 NullPointerException 예외를 제공되는 메소드로 간단히 회피할 수 있다.
즉, 복잡한 조건문 없이도 널값으로 인해 발생하는 예외를 처리할 수 있게 된다.
Optional 객체를 생성하기 위해서는 메서드를 사용해야 한다. Optional도 stream API 처럼 생성, 중개연산, 최종연산이 있다. 


*Optional 객체 생성
-Optional.of
value가 null인 경우 예외가 터진다. 반드시 값이 있어야 하는 객체인 경우 해당 메서드를 사용하면 된다.
Optional<String> opt = Optional.of("result");

-Optional.ofNullable
value가 null인 경우 비어있는 Optional을 반환한다. 값이 null일수도 있는 것은 해당 메서드를 사용하면 된다.
Optional<String> opt = Optional.ofNullable(null);

-Optional.empty
비어있는 Optional객체를 생성한다. 조건에 따라 분기를 태워야하고 반환할 값이 없는 경우에도 사용한다.
Optional<String> opt = Optional.empty();


*Optional 중개연산
-filter
predicate 값이 참이면 해당 필터를 통과시키고 거짓이면 통과되지 않는다.
Optional.of("True").filter((val) -> "True".eqauls(val)).orElse("No Data");

-map
mapper 함수를 통해 입력값을 다른 값으로 변환하는 메서드이다.
Optional.of("1").map(Integer::valueOf).orElseThrow(NoSuchElementException::new);

-flatMap
mapper 함수를 통해 입력값을 다른 값으로 변환하는 메서드이다. map과 다른 점은 메서드 시그니처의 매개변수라는 점이다. 
Optional.of("result").flatMap((val) -> Optional.of("good")).get();

-stream
stream메서드는 중개연산자로 기존 자바8에서 Optional 객체가 바로 스트림 객체로 전환되지 않아 불편했던 부분을 해소시켜준다.
Optional.of("result").stream().map(MemberDto::new).collect(Collectors.toList());

*Optional 최종연산
-ifPresent
최종적으로 연산을 끝낸 후에 값이 비어있지 않다면 입력값으로 주어진다. 이 값을 가지고 원하는 작업을 수행하면 된다. 하지만 중개연산을 하다 비어있는 Optional 객체를 받게되면 ifPresent 메서드의 내용을 수행하지 않는다. 
Optional.of("test").ifPresent((value) -> {//something to do});

-isPresent
최종적으로 연산을 끝낸 후에 객체가 존재하는지 여부를 판별한다.
Optional.ofNullable("test").isPresent(); //true

-get
최종적으로 연산을 끝낸 후에 객체를 꺼낸다. 이 때 비어있는 Optional 객체였다면 예외가 발생한다.
Optional.ofNullable(null).get(); //NoSuchElementException

-orElse
최종적으로 연산을 끝낸 후에도 Optional 객체가 비어있다면 기본값으로 제공할 객체를 지정한다.
Optional.ofNullable(null).orElse("default");

-orElseGet
최종적으로 연산을 끝낸 후에도 Optional 객체가 비어있다면 기본값으로 제공할 함수를 지정한다.
Optional.ofNullable("input").filter(x -> "test".equals(x)).ofElseGet(() -> "default");

-orElseThrow
최종적으로 연산을 끝낸 후에도 Optional 객체가 비어있다면 예외 공급자 함수를 통해 예외를 발생시킨다.
Optional.ofNullable("input").filter("test"::equals).orElseThrow(NoSuchElementException::new);

cf)orElse, orElseGet 중 무엇을 사용해야하나?
orElse 메서드는 Optional객체가 비어있든 비어있지않든 반드시 실행한다. orElseGet메서드는 Optional 객체가 비어있으면 실행한다. 따라서 기본값을 주고자 할때에 기본값을 구하는 과정이 오래걸린다면 orElseGet을 사용하자

'Java' 카테고리의 다른 글

스레드와 멀티스레드  (0) 2022.01.10
자바 람다식에 대한 고찰  (0) 2021.09.23
Timer / TimerTask  (0) 2021.09.06
자바 스트림API  (0) 2021.08.16
자바 람다식표현  (0) 2021.08.16