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
'언어(Language) > Java' 카테고리의 다른 글
[Java] 자바 파일 입출력 스트림 FileReader와 FileWriter 개념 정리 및 활용 (0) | 2022.09.28 |
---|---|
[Java] 자바 파일 입출력 스트림 FileInputStream과 FileOutputStream 개념 정리 및 활용 (0) | 2022.09.28 |
[Java] 자바 스트림 생성과 중간 연산, 최종 연산의 개념 정리 및 활용 (0) | 2022.09.26 |
[Java] 자바 스트림 파이프라인 개념 정리 및 활용 (0) | 2022.09.26 |
[Java] 자바 스트림(Stream) 개념 정리 및 활용 (0) | 2022.09.26 |