Java java.math 패키지의 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의 경우 NoSuchElementExceptionthrow하고, 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);
    }
}

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

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