dev/자바

JAVA Optional이란?

아디봉 2024. 2. 27. 15:40

Optional 이란?

optional 이라는 단어는 우리 나라말로 "선택적인"이라는 의미이다. 

즉, 객체를 편리하게 처리하기 위해서 만든 클래스라고 보면된다. 

Optional 클래스는 java.util 패키지에 속해 있다. 

public final class Optional<T> extends object

 

object 클래스를 확장했고 final 클래스로 선언되어 있으며, generic 한 클래스다. 

final 변수는 변경불가능 하지만, final 클래스로 선언했다고 해서 내용 변경이 불가능한 것은 아니다. 

대신 추가적인 확장이 불가능하다. 즉 자식 클래스를 만들 수 없다는 의미다. 

이 곳에 물건을 넣을 수도 있고, 아무 물건이 없을 수 도 있다. 

그래서 기본적인 클래스를 만들기 위해서는 new Optional()과 같이 객체를 생성하지 않는다. 

 

Optional 객체생성 

리턴 메소드 empty(), of(), ofNullable()

private static void createOptionalObjects(){
        //empty()
        //데이터가 없는 Optional 객체를 생성하려면 이와 같이 empty() 메소드 사용
        Optional<String> emptyStr = Optional.empty();

        //ofNullable
        //만약 null이 추가될 수 있는 상황이라면 ofNullable() 메소드 사용
        String common = null;
        Optional<String> nullableStr = Optional.ofNullable(common);

        //of
        //반드시 데이터가 들어갈 수 있는 상황에서는 of()메서드 사용
        common = "common";
        Optional<String> commonStr = Optional.of(common);
    }

 

Optional 객체 확인

isPresent()

private static void checkOptionalData(){
        System.out.println(Optional.of("present").isPresent());
        System.out.println(Optional.ofNullable(null).isPresent());
    }

 

Optional 데이터 리턴 

get(), orElse(), orElseGet(), orElseThrow() 

private static void getOptionalData(Optional<String> data) throws Exception {
        String defaultVal = "default";
        //가장 많이 사용되는 get() 메소드. 만약 데이터가 없을 경우 null이 리턴된다.
        String result1 = data.get();

        //만약값이 없을 경우에는 orElse()메소드를 사용하여 기본값을 지정할 수 있다.
        String result2 = data.orElse(defaultVal);


        Supplier<String> stringSupplier = new Supplier<String>() {
            @Override
            public String get() {
                return "Java8 Optional";
            }
        };

        //Supplier<T>라는 인터페이스를 활용하는 방법으로 orElseGet() 메소드를 사용할 수 있다.
        //Supplier<T>는 람다표현식에서 사용하려는 요도로 만들어 졌으며, get()메소드가 선언되어있다.
        String result3 = data.orElseGet(stringSupplier);

        Supplier<Exception> exceptionSupplier = new Supplier<Exception>() {
            @Override
            public Exception get() {
                return new Exception();
            }
        };
        //만약 데이터가 없을 경우에 예외를 발생시키고 싶다면, orElseThrow() 메소드를 사용한다.
        String result4 = data.orElseThrow(exceptionSupplier);
    }

 

정리 

Optional 클래스는 null 처리를 보다 간편하게 하기 위해서 만들어졌다. 잘못하면 NullPointerException 이 발생할 수 있는데, 이문제를 보다 간편하고 명확하게 처리하려면 Optional을 사용하면 된다.