<T>null 을 간접적으로 다루기 위한 객체null 을 직접 다룰 때 문제점null 을 직접 다루는 것은 위험NullPointerException 발생null 체크 → if 문 필수 → 코드가 지저분해진다.null 을 다룬다.null 이 아니다.<T> 객체 생성하기String str = "abc";
Optional<String> optVal = Optional.of(str);
Optional<String> optVal = Optional.of(null); // ❌ NullPointerException 발생
Optional<String> optVal = Optional.ofNullable(null); // ✅ OK

null 값이 될 수 없는 구조null 값 불가null 값을 넣을려면 ofNullable() 사용null 대신 빈 Optional 객체를 사용Optional<String> optVal = null; // ❌ 바람직하지 않음
Optional<String> optVal = Optional.<String>empty();
// ✅ 빈 객체로 초기화
NullPointerException 을 줄이기 위해 사용get() orElse() orElseGet() orElseThrow()
Optional<String> optVal = Optional.of("abc");
// optVal 에 저장된 값을 반환, null 이면 예외 발생
String str1 = optVal.get();
// optVal 에 저장된 값이 null 일 때는, ""를 반환
String str2 = optVal.orElse("");
// 람다식 사용 가능 () -> new String()
String str3 = optVal.orElseGet(String::new);
// null 이면 예외 발생 (예외 종류 지정 가능)
String str4 = optVal.orElseThrow(NullPointerException::new);
isPresent()if(Optional.ofNullable(str).isPresent()) { // if(str!=null)
System.out.println(str);
}
null 이면 false, 아니면 true 를 반환ifPresent()Optional.ofNullable(str).ifPresent(System.out::println);
null 이 아닐때만 작업 수행null 이면 아무 일도 안 함public final class OptionalInt {
private final boolean isPresent; // 값이 저장되어 있으면 true
private final int value; // int 타입의 변수
| Optional 클래스 | 값을 반환하는 메서드 |
|---|---|
Optional<T> | T get() |
| OptionalInt | int getAsInt() |
| OptionalLong | long getAsLong() |
| OptionalDouble | double getAsDouble() |
OptionalInt opt = OptionalInt.of(0); // 0
OptionalInt opt2 = OptionalInt.empty(); // 0
// 구분 가능?
System.out.println(opt.isPresent()); // true
System.out.println(opt2.isPresent()); // false
System.out.println(opt.equals(opt2)); // false
isPresent() 로 구별