Java

[Java] Optional<T> 클래스

HSRyuuu 2023. 5. 3. 23:52

Optional

Java8부터 Optional <T> 클래스를 사용해 NPE(Null Pointer Exception)을 방지할 수 있다.
만약 null이면 안 되는 어떤 값을 검사해야 할 때, if 문들 사용해서
"null일 때는 어떻게 하고~ null이 아니면 어떻게 하고~"를 일일이 작성해야 하는 불편함이 있었다.
Optional <T>을 사용하면 이 부분의 코드를 간결하게 바꿀 수 있다.

Optional 이란?

 

Optional<T> null이 올 수 있는 값을 감싸는 Wrapper 클래스이다.
Optional로 설정된 값을 참조하더라고 NPE가 발생하지 않도록 도와준다.
즉, 예상치 못한 NPE 예외 발생을 피할 수 있어 권장되는 방법이라고 한다.


Optional 객체 생성

of() 또는 ofNullable()을 사용해서 Optional 객체를 생성할 수 있다.

1) ofNullable()

  • Null이 발생할 가능성이 있는 경우에 ofNullable()을 통해 생성하면, NPE를 발생시키지 않는다.
  • value의 값이 null인 경우 Optional.empty()가 반환된다.
Optional<String> optional = Optional.ofNullable(value);

2) of()

  • 이 경우에는 value의 값이 null인 경우 NPE에러가 발생한다.
  • 따라서 반드시 값이 있어야 하는 경우에 사용한다.
Optional<String> optional = Optional.of(value);

Optional의 기능을 남용하는 것은 좋지 않다.
따라서 만약 값이 존재할 때만 동작하는 로직이 있거나, 어떤 값은 반드시 존재한다면, of()로 생성하는 것이 좋다.


3) Optional.empty()

  • 생성할 때 비어있는 객체로 생성할 수도 있다.
Optional<String> optional = Optional.empty();

4) 생성 예제

        String str = "hello";
        String nullStr = null;
        //1. not-null 값을 ofNullable()로 생성
        Optional<String> op1 = Optional.ofNullable(str);
        System.out.println(op1);
        
        //2. null 값을 ofNullable()로 생성
        Optional<String> op2 = Optional.ofNullable(nullStr);
        System.out.println(op2);
        
        //3. Optional.empty()로 생성
        Optional<String> op3 = Optional.empty();
        System.out.println(op3);
        
        //4. null 값을 of()로 생성
        Optional<String> op4 = Optional.of(nullStr);
        System.out.println(op4);
  1. Optional [hello] 출력
  2. Optional.empty 출력
  3. Optional.empty 출력
  4. NullPointerException 예외 발생

Methods

1) get()

  • Optional 객체에 들어있는 값을 반환한다. (정확히는 Wrapper 클래스인 Optional을 unboxing 하는 메서드이다.)
  • 만약 Optional 객체에 값이 들어있지 않으면 NoSuchElementException 예외가 발생한다.

위의 예제에서도 볼 수 있듯이, Optional 객체를 직접 반환하면 Optional [hello]와 같이 반환된다.
Optional로 Wrapping 된 값을 가져오려면 get() 메서드를 이용하여 값을 꺼내야 한다.


2) isPresent()

  • Optional 객체에 값이 존재하면 true, 그렇지 않으면 false를 반환한다.

3) isEmpty()

  • Optional 객체에 값이 존재하지 않으면 true , 그렇지 않으면 false를 반환한다.

4) orElse()

  • orElse(T)로 지정된 값이 존재하면 그 값을 반환하고, 그렇지 않으면 Optional로 전달된 값을 반환한다.
String str = "hello";
String nullStr = null;

String str1 = Optional.ofNullable(str);
String str2 = Optional.ofNullable(nullStr).orElse("hi");

// str1 : hello , str2 : hi

5) orElseThrow()

  • 값이 존재하면 그 값을 반환하고, 그렇지 않으면 예외를 던진다.
  • 람다식을 이용한다.
xxxRepository.findById(userId)
	.orElseThrow( () -> new NoSuchElementException() );
반응형