시작이 반

[Java] Optional 본문

Programming/Java

[Java] Optional

G_Gi 2021. 1. 20. 00:36
SMALL

java.util.Optional<T> 클래스

Optional<T>은 T 타입의 객체를 포장해주는 래퍼 클래스(Wrapper class)이다.

예상치 못한 NullPointerException 예외를 Optional에서 제공되는 메소드로 간단히 회피할 수 있다.

null이나 null이 아닌 값을 담을 수 있는 클래스이다.

즉, null값으로 인해 발생하는 예뢰를 처리할 수 있게 된다.

 

Optional 객체 생성

  • Optional.empty() : null을 담고있는, 비어있는 Optional 객체 생성
  • Optional.of(value) : value값이 null이 아닌 객체를 담고 있는 Optional객체를 생성, valuel값이 null이 아닌 경우에 사용 null이 넘어올 경우 NPE를 던진다.
  • Optional.ofNullable(value) : null인지 아닌지 확신할 수 없는 객체를 담고 있는 Optional객체를 생성, value값이 null인지 아닌지 확실하지 않은 경우에 사용
        String str = "test";

        Optional<String> optStr1 = Optional.empty();
        Optional<String> optStr2 = Optional.of(str);
        Optional<String> optStr3 = Optional.ofNullable(str);

        String nullStr = null;

        Optional<String> optStr4 = Optional.empty();
        Optional<String> optStr5 = Optional.of(nullStr); //NPE 발생
        Optional<String> optStr6 = Optional.ofNullable(nullStr); //empty Optional 객체를 반환함

 

Optional이 담고 있는 객체 접근 및 사용

default : Optional이 담고 있는 객체가 존재할 경우 동일하게 해당 값을 반환

 

비어있을 경우

  • get() : 비어있는 Optional 객체에 대해서, NoSuchElementException을 던진다.

        String str = "test";

        Optional<String> optStr1 = Optional.empty();
        Optional<String> optStr2 = Optional.of(str);
        Optional<String> optStr3 = Optional.ofNullable(str);

        System.out.println(optStr1.get()); //NoSuchElementException
        System.out.println(optStr2.get()); //test
        System.out.println(optStr3.get()); //test

 

  • orElse(T other) : 비어있는 Optional 객체에 대해서 인수로 전달된 값을 반환한다.

        String str = "test";

        Optional<String> optStr1 = Optional.empty();
        Optional<String> optStr2 = Optional.of(str);
        Optional<String> optStr3 = Optional.ofNullable(str);

        System.out.println(optStr1.orElse("null")); //null
        System.out.println(optStr2.orElse("null")); //test
        System.out.println(optStr3.orElse("null")); //test

 

  • orElseGet(Supplier<? extends T> other) : 비어있는 Optional 객체에 대해서 넘어온 함수형 인자를 통해 생성된 객체를 반환한다.
public static void main(String[] args) {
	// write your code here
        String str = "test";

        Optional<String> optStr1 = Optional.empty();
        Optional<String> optStr2 = Optional.of(str);
        Optional<String> optStr3 = Optional.ofNullable(str);

        System.out.println(optStr1.orElseGet(() -> getDefaultValue())); //함수 return값 반환
        System.out.println(optStr2.orElseGet(() -> getDefaultValue())); //test
        System.out.println(optStr3.orElseGet(() -> getDefaultValue())); //test
    }

    public static String getDefaultValue() {
        return "함수 return값 반환";
    }

 

  • orElseThrow(Supplier<? extends X> exceptionSupplier) : 비어있는 Optional 객체에 대해서 넘어온 함수형 인자를 통해 생성된 예외를 던진다.
        String str = "test";

        Optional<String> optStr1 = Optional.empty();
        Optional<String> optStr2 = Optional.of(str);
        Optional<String> optStr3 = Optional.ofNullable(str);

        System.out.println(optStr1.orElseThrow(NullPointerException::new)); //NPE
        System.out.println(optStr2.orElseThrow(NullPointerException::new)); //test
        System.out.println(optStr3.orElseThrow(NullPointerException::new)); //test

하지만 이런 방식은 기존의 null을 체크하는 방식과 다른게 없음 오히려 Optional을 써서 타이핑만 더 치는 안 좋은 방법

 

  • IfPresent() : non-null인 경우 인자로 넘긴 함수를 실행, 비어있는 경우 인자로 넘긴 함수는 실행되지 않는다.
        String str = "test";

        Optional<String> optStr1 = Optional.ofNullable(str);
        Optional<String> optStr2 = Optional.ofNullable(null);

        optStr1.ifPresent(s -> System.out.println(s.charAt(0))); //t 프린트
        optStr2.ifPresent(s -> System.out.println(s.charAt(0))); //print 안됨

 

  • isPresent() : 해당 값이 있는지 확인 있으면 ture, 없으면 false
LIST

'Programming > Java' 카테고리의 다른 글

[Java] 코테 준비 ( 알아야할 것들)  (2) 2021.08.13
[Java] SOLID  (1) 2021.05.10
[Java] Lombok  (0) 2021.01.25
[Java] Stream  (0) 2021.01.20
[Java] 람다식(Lambda)  (0) 2021.01.20