- T 타입 객체의 래퍼 클래스 - Optional <T>
래퍼 클래스란? Integer , Long.... int(X)
public final class Optional <T> {
private final T value; // T타입의 참조 변수
...
}
T타입의 value는 모든 종류의 객체를 저장할 수 있다.(null을 저장할 수 있다.)
null을 직접 사용하면 위험 부담이 크다 nullpointException이 발생할 수 있기 때문!!
간접적으로 null을 다루기 위해서 Optional 사용함.
한마디로, null이 올 수 있는 값을 감싸는 wrapper 클래스! 🤗
if(result != null){
result.toString()
}
이런 식으로 null이 없을 때 사용해야 되기 때문에 if문을 사용하는 것을 방지해주기 위해 Optional을 사용함.
Optional <T> 객체 생성하기
- Optional<T> 객체를 생성하는 다양한 방법
String str = "abc";
Optional <String> optVal = Optional.of(str);
Optional <String> optVal = Optional.of("abc");
Optional <String> optVal = Optional.of(null);
Optional<String> optVal = Optional.ofNullable(null);
한 단계 더 거친 거라고 생각하면 됨.
- null대신 빈 Optional <T> 객체를 사용하자
Optional <String> optVal = null; // 널로 초기화. 바람직하지 않음.
Optional <String> optVal = Optional. <String> empty(); // 빈 객체로 초기화
Optional <T> 객체의 값 가져오기
- Optional객체의 값 가져오기 - get(), orElse(), orElseGet(), orElseThrow()
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이면 예외 발생
- isPresent() - Optional객체의 값이 null이면 false, 아니면 true를 반환
if(Optional.ofNullable(str). isPresent()){
System.out.println(str);
}
// ifPresent(Consumer) - null이 아닐 때만 작업 수행, null이면 아무 일도 안 함
Optional.ofNullable(str). ifPresent(System.out::println);
Surround With 들어가면 try / catch문 자동으로 만들어 준다.
package OptionalPt;
import java.util.Optional;
public class OptionalTests {
public static void main(String[] args) {
Optional<String> opt2 = null; // OK. 하지만 null은 바람직하지 않다.
Optional<String> opt = Optional.empty();
System.out.println("opt="+opt);
//System.out.println("opt="+opt.get()); // null이여서 예외 발생함. get 잘 안씀
String str = "";
try {
str = opt.get();
} catch (Exception e) {
str =""; // 예외 발생하면 ""로 초기화
}
// str = opt.orElse("EMPTY"); // Optional에 저장된 값이 null이면 ""반환
// str = opt.orElseGet(() -> new String()); // Optional에 저장된 값이 null이면 ""반환
str = opt.orElseGet(String::new); // Optional에 지정된 값이 null이면 ""반환
System.out.println("str="+str);
}
}
OptionalInt, OptionalLong, OptionalDouble
- 기본형 값을 감싸는 래퍼 클래스
성능 때문에 씀.. 그냥 Optional 써도 상관없다.
- OptionalInt의 값 가져오기 - int getAsInt()
Optional <T> T get()
OptionalInt int getAsInt()
OptionalLong long getAsLong()
OptionalDouble double getAsDouble()
- 빈 Optional객체와의 비교
OptionalInt opt = OptionalInt.of(0); // OptionalInt에 0을 저장
OptionalInt opt2 = OptionalInt.empty(); // OptionalInt에 0을 저장
System.out.println(opt.isPresent()); // true
System.out.println(opt2.isPresent()); // false
System.out.prinltln(opt.equals(opt2)); // false
opt는 value가 0이어서 값은 있음.
empty도 value는 0인데 값이 없어서 false이다.
package OptionalPt;
import java.util.Optional;
import java.util.OptionalInt;
public class OptionalTests2 {
public static void main(String[] args) {
Optional<String> optStr = Optional.of("abcde");
Optional<Integer> optInt = optStr.map(String::length);
System.out.println(optStr);
System.out.println(optInt);
int result1 = Optional.of("123")
.filter(x->x.length() > 0)
.map(Integer::parseInt).get();
int result2 = Optional.of("")
.filter(x->x.length() > 0)
.map(Integer::parseInt).orElse(-1);
System.out.println(result1);
System.out.println(result2);
Optional.of("456").map(Integer::parseInt)
.ifPresent(x->System.out.printf("result3=%d%n",x));
OptionalInt optInt1 = OptionalInt.of(0); // 0을 저장
OptionalInt optInt2 = OptionalInt.empty(); // 빈 객체를 생성
System.out.println(optInt1.isPresent()); // true
System.out.println(optInt2.isPresent()); // false
}
}
'Java' 카테고리의 다른 글
Java : 변수 종류, 인스턴스 변수, 클래스 변수 (0) | 2021.10.29 |
---|---|
Java : 객체지향 언어 , 클래스 , 인스턴스 (0) | 2021.10.28 |
Java : 스트림의 연산,중간 연산(2) - 기초 (0) | 2021.09.04 |
Java : 스트림의 연산,중간 연산(1) - 기초 (0) | 2021.09.03 |
Java : 스트림,스트림의 특징,스트림 만들기 - 기초 (0) | 2021.09.01 |