T 타입 객체의 래퍼클래스 - Optional< T >
필요한 이유

한 단계 더 거치게 된다.
Optional<String> optVal = null; // 널로 초기화. 바람직하지 않음
Optional<String> optVal = Optional.<String>empty(); // 빈 객체로 초기화
Optional< T > 객체의 값 가져오기 - get(), orElse(), orElseGet(), orElseThrow()

isPresent() - Optional객체의 값이 null이면 false, 아니면 true를 반환
import java.util.Optional;
import java.util.stream.Stream;
class Java {
public static void main(String[] args) {
// int[] arr = null;
int[] arr = new int[0];
System.out.println("arr.length = " + arr.length);
// Optional<String> opt = null; // ok. 하지만 바람직 하지 않음
Optional<String> opt = Optional.empty();
// Optional<String> opt = Optional.of("abc");
System.out.println("opt = " + opt);
// System.out.println("opt = " + opt.get());
String str = "";
// try {
// str = opt.get();
// } catch (Exception e) {
// str = ""; // 예외가 발생하면 빈문자로 초기화
// } // 예외 발생
// str = opt.orElse("EMPTY"); // Optional에 저장된 값이 null이면 "" 반환
// str = opt.orElseGet(() -> new String());
str = opt.orElseGet(String::new); // 위문장을 람다식으로
System.out.println("str = " + str);
}
}
기본형 값을 감싸는 래퍼클래스
쓰는 이유 : 성능을 올리려고
Optionalint의 값 가져오기 - int getAsint()

빈 Optional객체와의 비교
