Java 공부

Optional 객체 다루기

고줭 2021. 10. 5. 15:27

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