언어(Language)/Java

[Java] 자바 옵셔널(Optional) 개념 정리 및 활용

잇트루 2022. 9. 27. 06:00
반응형

Optional<T>

옵셔널(Optional)은 NPE(NullPointerException) 문제를 해결할 수 있는 방법을 제공한다.

즉, null 값으로 인해 에러가 발생하는 현상을 효율적으로 방지하는 것이다.

 

연산 결과를 Optional에 담아서 반환하는 것으로, 따로 조건문을 작성하지 않아도 NPE가 발생하지 않도록 할 수 있다.

 

옵셔널 클래스(Optional Class)

옵셔널 클래스는 모든 타입의 객체를 담을 수 있는 래퍼 클래스이다.

Optional 객체를 생성하려면 of() 메서드 또는 ofNullable() 메서드를 사용한다. 참조 변수의 값이 null일 가능성이 있다면, ofNullable() 메서드를 사용한다.

 

isPresent()

isPresent() 메서드는 Optional 객체의 참조 변수의 값이 null이면 false를, null이 아니면 true를 반환한다.

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

//Optional 객체의 값이 null인지 여부를 판단하여 true 또는 false로 반환
System.out.println(opt1.isPresent()); // false
System.out.println(opt2.isPresent()); // true

 

empty()

Optional 타입의 참조 변수를 기본값으로 초기화하려면 empty() 메서드를 사용한다.

// Optional<String> opt3 = Optional.<String>empty();
Optional<String> opt3 = Optional.empty();
System.out.println(opt3); // Optional.empty

 

get()

Optional 객체에 저장된 값을 가져오려면 get() 메서드를 사용한다.

만약, 참조 변수의 값이 null일 가능성이 있다면, orElse() 메서드를 통해 디폴트 값을 지정할 수 있다.

Optional<String> opt = Optional.of("Hello Java World");
System.out.println(opt); //Optional[Hello Java World]
System.out.println(opt.get()); // Hello Java World

String nullStr = null;
String str = Optional.ofNullable(nullStr).orElse("Default");
System.out.println(str); // Default

 

Optional 객체는 스트림과 유사하게 여러 메서드를 연결하여 작성할 수 있다.

이를 메서드 체이닝(Method Chaining)이라 한다.

import java.util.Arrays;
import java.util.List;
import java.util.Optional;

public class MethodChainingEx {
    public static void main(String[] args) {
        List<String> list = Arrays.asList(
            "C", "C++", "Java", "Python", "Kotlin"
        );

        Optional<List<String>> listOptional = Optional.of(list);

        int size = listOptional
            .map(List::size)
            .orElse(0);
    
        System.out.println(size);
    }
}

 

이외의 다양한 Optional 메서드는 공식 문서에서 찾을 수 있다.

https://docs.oracle.com/javase/8/docs/api/java/util/Optional.html

 

Optional (Java Platform SE 8 )

A container object which may or may not contain a non-null value. If a value is present, isPresent() will return true and get() will return the value. Additional methods that depend on the presence or absence of a contained value are provided, such as orEl

docs.oracle.com

 

반응형