Java Optional 클래스

Optional는 Java8에서 추가 된 클래스이다. Optional 클래스는 null를 다룰 때 편리한 클래스이므로, 기본적 작성법을 알아보도록 하자.

Optional란

Optional는 메소드의 반환 값으로 null을 반환 할 수 있음을 명시적으로 표시하고자 할 때 사용한다. 메소드가 null을 반환 할 수 있음을 나타내는 것으로, 그 메소드를 사용하는 프로그램을 보다 안전하게 구현할 수 있도록 한다.

Optional 선언 방법

Optional를 사용하려면 형식을 래핑하여 사용한다.

Optional<String> optinoal;

사용자가 만든 클래스에서도 사용할 수 있다.

import java.math.BigDecimal;

public class Foo {
    private String str;
    private BigDecimal value;
}
Optional<Foo> opt;

Optional 인스턴스 생성

Optional 클래스는 인스턴스 생성의 static 메소드가 제공하고 있어, 이 메소드를 사용해 생성한다.

  • Optional.empty() : 값이 null인 Optional 인스턴스를 생성한다.
  • Optional.of(값) : 인자 값에 대한 Optional 인스턴스 생성한다
  • Optional.ofNullable(값) : 인자 값이 null의 경우는 empty, null가 아닌 경우는 of 메소드의 결과와 동일하다.

Optional.of는 아래와 같이 선언 할수 있다.

Optional<String> opt1 = Optional.of("test");

Optional.of에는 인수가 null의 경우 java.lang.NullPointerException이 발생하므로 주의가 필요하다.

Optional<String> opt1 = Optional.of(null);

그래서 주로 Optional.ofNullable을 사용한다.

Optional<String> opt1 = Optional.ofNullable("test");
Optional<String> opt2 = Optional.ofNullable(null);

Foo test = new Foo();
Optional<Foo> opt3 = Optional.ofNullable(test);

Optional 반환 메소드 사용 방법

Optional 반환 메소드에 대해서 알아보자.

or 메소드 사용법

or 메서드는 Optional.ofNullable 메소드의 인수로 지정된 객체가 null의 경우에만 처리를 실행한다.

import java.util.Optional;

public class Sample {
    public static void main(String[] args) {
        String str = null;
        Optional<String> value = Optional.ofNullable(str);
        System.out.println(value.or(() -> Optional.of("null입니다.")).get());
    }
}

실행 결과:

null입니다.

orEsle 메소드 사용법

Optional.ofNullable 메소드의 인수가 null의 경우, orElse 메소드의 인수에 값을 반환한다. null가 아닌 경우는 null이 아닌 값을 반환한다.

import java.util.Optional;

public class Sample {
    public static void main(String[] args) {
        String str = null;
        Optional<String> value = Optional.ofNullable(str);
        str = value.orElse("null입니다.");
        System.out.println(str);
    }
}

실행 결과:

null입니다.

orElseGet 메소드 사용법

Optional.ofNullable 메소드의 인수가 null의 경우, orElseGet 메소드의 suppelier 결과를 반환한다. null가 아닌 경우는 null이 아닌 값을 반환한다.

import java.util.Optional;

public class Sample {
    public static void main(String[] args) {
        String str = null;
        Optional<String> value = Optional.ofNullable(str);
        str = value.orElseGet(Sample::getDefaultValue);
        System.out.println(str);
    }
    
    private static String getDefaultValue(){
        return "Default 입니다.";
    }
}

실행 결과는 아래와 같다.

Default 입니다.

orElseThrow 메소드 사용법

orElseThrow 메서드는 인수의 있고 없고에 따라 처리가 다르다. 인수가 없는 경우는 null의 경우 NoSuchElementException를 throw하고, null가 아닌 경우는 값을 돌려 준다.

import java.util.NoSuchElementException;
import java.util.Optional;

public class Sample {
    public static void main(String[] args) {
        String str = null;
        Optional<String> value = Optional.ofNullable(str);
        try {
            str = value.orElseThrow();
            System.out.println(str);
        } catch (NoSuchElementException ex) {
            System.out.println("null입니다.");
        }
    }
}

실행 결과

null입니다.

인수가 있는 경우에는 Throw를 통해 예외 클래스의 객체를 지정할 수 있다.

import java.util.Optional;

public class Sample {
    public static void main(String[] args) {
        String str = null;
        Optional<String> value = Optional.ofNullable(str);
        try {
            System.out.println(value.orElseThrow(() -> new RuntimeException()));
        } catch (RuntimeException e) {
            System.out.println("null입니다.");
        }    
    }
}

실행 결과:

null입니다.

ifPresent 메소드 사용법

null가 아닌 경우에만 인수에 지정된 작업을 실행한다.

import java.util.Optional;

public class Sample {
    public static void main(String[] args) {
        String str = null;
        Optional<String> value = Optional.ofNullable(str);
        value.ifPresent(System.out::println);
    }
}

실행을 하면 str가 null이기에 아무것도 처리되지 않는다.

ifPresentOrElse 메소드 사용법

null의 경우에도 처리를 할 수 있다. null가 아닌 경우의 처리를 첫번째 인자에 지정하고, null의 경우의 처리를 두번째 인자에 지정한다.

import java.util.Optional;

public class Sample {
    public static void main(String[] args) {
        String str = null;
        Optional<String> value = Optional.ofNullable(str);
        value.ifPresentOrElse(
            System.out::println, 
            () -> System.out.println("null입니다"));
    }
}

실행 결과:

null입니다.



최종 수정 : 2021-08-27