Optional
1. Optional을 사용하는 이유
null을 한번 감싸서 간접적으로 다루기 위함
2. null 직접적으로 다루는 경우
1) NullpointException이 발생할 가능성이 있다.
2) if( result ! = null) ---- null을 체크하기 위한 if문이 필수, 코드가 복잡해짐
public final class Optional<T> {
private final T value; //T타입의 참조변수 ex) Animal ani
... 객체타입 참조변수
}
- Optional<T>는 'T타입의 객체'를 감싸는 래퍼 클래스이다. 여기서 T는 "null을 포함한 모든 객체를 의미"한다. 따라서 Optional타입의 객체에는 모든 타입의 객체를 담을 수 있다.
- value는 "참조변수"이므로 null을 포함한 주소값이 저장될 수 있는데,
- String 타입의 주소값이 저장되면, String객체를 가리키고,
- Integer타입의 주소값이 저장되면 Integer를 가리키고,
- Person타입의 주소값이 저장되면 Person객체를 가리킨다.
- 따라서 Optional타입의 객체에는 모든 타입의 객체를 담을 수 있다.
3. Optional<T>객체를 생성하는 다양한 방법
String str = "abc";
Optional<String> opt = Optional.of(str); //클래스.메서드이름(x)
Optional<String> opt = Optional.of("abc");
Optional<String> opt = Optional.of(null); //NullPointerException발생
Optional<String> opt = Optional.ofNullable(null); //OK
*String str = null; 이 될 수 있으므로 Optional객체의 value(참조변수)값이 null 이 될 수 있다.
4. null대신 빈 Optional<T> 객체를 사용하자
Optional<String> opt = Optional.<String>empty(); //빈 객체로 초기화, <String>생략가능
5. Optional<T> 객체의 값 가져오기
Optional<String> optVal = Optional.of("abc"); //클래스.메소드이름(x)
String str1 = optVal.get(); //optVal에 저장된 값을 반환. null이면 예외발생
String str2 = optVal.orElse(-1); //optVal에 저장된 값이 null일 때는, -1를 반환
//값이 있는 경우에는 그 값을 반환
String str3 = optVal.orElseGet(String::new); //람다식 사용가능 () -> new String()
String str4 = optVal.orElseThrow(NullPointerException::new); //예외종류 지정가능
if (str != null) {
System.out.println(str);
}
6. isPresent()는 Optional객체의 값이 null이 아니면 True를 반환하고, null이면 false를 반환한다.
if(Optional.ofNullable(str).isPresent()) {
System.out.println(str);
}
7. ifPresent()는 Optional객체의 값이 null이 아니면, 람다식을 수행하고, null이면 아무 일도 일어나지 않는다.
Optional.ofNullable(str).ifPresent(System.out::println);
8. OptionalInt : int형을 감싸는 래퍼클래스
public final class OptionalInt {
...
private final boolean isPresent; //값이 저장되어 있으면 true
private final int value;
}
9. OptionalInt 심화
OptionalInt opt = OptionalInt.of(0); //OptionalInt 객체에 0을 저장
OptionalInt opt2 = OptionalInt.empty(); //OptionalInt 객체에 0을 저장
OptionaInt객체가 아무런 값도 갖지 않는 경우 0이 저장됨
System.out.println(opt.isPresent()); //true 값이 있다.
System.out.println(opt2.isPresent()); //false 값이 없다.
System.out.println(opt.equals(opt2)); //fasle 0을 저장하는 것과 값이 없어서 0을 저장하는 것은 다르다.
'자바 > Java (중요하고, 이해 안 되고, 어려운)' 카테고리의 다른 글
Stream (0) | 2022.10.31 |
---|---|
메서드 참조 (0) | 2022.10.30 |
람다 Lambda (0) | 2022.10.30 |
Comparable (0) | 2022.10.27 |
생성자 (0) | 2022.10.26 |