Optional은 Wrapper클래스로서 모든 종류의 객체를 담을 수 있습니다.
📕 Optional을 쓰는 이유는?
1. null을 직접 다루는건 위험 (NPE 위험)
2. null 체크를 위해 if문이 필수 (코드가 지저분해짐)
결론 : null 일 수 있는 객체는 Optional로 감싸자.
Optional<String> optVal = null; // 바람직하지 않음
Optional<String> optVal = Optional.empty(); // 빈 객체로 초기화
📗 Optional<T> 객체의 값 가져오기
Optional<String> optVal = Optional.of("abc");
String str1 = optVal.get(); // optVal에 저장된 값을 반환. null이면 예외발생
String str2 = optVal.orElse(""); // optVal에 저장된 값이 null일 때는, ""를 반환
String str3 = optVal.orElseGet(String::new); // 람다식 사용가능 () -> new String()
String str4 = optVal.orElseThrow(NullPointerException::new); // null이면 예외발생
📘 OptionalInt, OptionalLong, OptionDouble ?
Optional 객체는 모든 것을 감싸고 있기때문에 성능이 떨어질 수 있다. 그렇기에 int, long, double의 경우는 성능을위해 위 Optional객체를 사용할 수 있다.
Optional 클래스 | 값을 반환하는 메서드 |
Optional<T> | get() |
OptionalInt | getAsInt() |
OptionalLong | getAsLong() |
OptionalDouble | getAsDouble() |
📙 빈 Optional 객체와의 비교
public final class OptionalInt {
...
private final boolean isPresent; // 값이 저장되어 있으면 true
private final int value; // int 타입의 변수
OptionalInt opt1 = OptionalInt.of(0); // OptionalInt에 0을 저장
OptionalInt opt2 = OptionalInt.empty(); // OptionalInt에 0을 저장
** 둘 다 0이 저장되어 있지만 empty()의 0과 0을 저장한건 다른거라고 하네요. 비어있는 객체인지 저장된 0인지 구별하는 방법은 isPresent를 사용하면 됩니다.
System.out.println(opt1.isPresent()); // true
System.out.println(opt2.isPresent()); // false
System.out.println(opt1.equals(opt2)); // false
System.out.println(opt1.getAsInt()); // 0
System.out.println(opt2.getAsInt()); // NoSuchElementException 예외 발생
* 출처 : https://www.youtube.com/watch?v=W_kPjiTF9RI
'Java 공부' 카테고리의 다른 글
[자료구조] List, LinkedList, ArrayList, Vector... (0) | 2022.05.07 |
---|---|
== equals 뭐가 달라? (0) | 2021.10.22 |
String , new String (4) | 2021.10.01 |
자바 공식문서 보는방법. (0) | 2021.03.29 |
그래들 스프링 이클립스에 임포트하기 (0) | 2021.02.25 |