T타입 객체의 래퍼클래스
public final class Optional<T> {
private final T value; //T타입의 참조변수
...
}
T
에는 모든 종류의 객체가 저장가능하다. 특히, null
도 가능하다
null
을 직접 다루는 것은 위험할 뿐더러 (NullPointerException)
, 항상 if (obj == null)
과 같은 조건식을 통해 처리해주어야 하는데, null
을 감쌀 수 있는 Optional
객체로 감싸는 것이 하나의 해결책이 될 수 있다.
null
이 될수 있는 객체는 Optional
로 다루는 것이 권장된다.
String str = "abc";
//str을 옵셔널로 감싸기
Optional<String> optVal = Optional.of(str);
//null을 감싸는 경우엔 .ofNullable을 통해 다루기
Optional<String> optNullVal = Optional.ofNullable(null);
//생성 및 초기화시 다른 객체나 타입과 마찬가지로 null이 아닌 값으로 초기화
//Optional.empty()을 사용
Optional<String> optInitVal = Optional.empty();
public static void play() {
Optional<String> optValue_1 = Optional.of("Hello");
Optional<String> optValue_2 = Optional.ofNullable(null); //null로 지정
printMessage(optValue_1);
printMessage(optValue_2);
}
private static void printMessage(Optional<String> optValue){
String getValue = optValue.orElse("Is Empty"); //optValue가 null 이면 getValue = "Is Empty"
System.out.println("getValue = " + getValue);
}
//getValue = Hello
//getValue = Is Empty
public static void play() {
Optional<String> optValue_1 = Optional.of("Hello");
Optional<String> optValue_2 = Optional.ofNullable(null);
try {
throwException(optValue_1);
System.out.println("optValue_1 = PASS");
throwException(optValue_2);
} catch (Exception e) {
System.out.println("optValue_2 = FAIL");
}
}
private static void throwException(Optional<String> optValue) {
optValue.orElseThrow(); //optValue가 null 이면 예외 발생
}
// optValue_1 = PASS
// optValue_2 = FAIL
public static void play() {
Optional<String> optValue_1 = Optional.of("Hello");
Optional<String> optValue_2 = Optional.ofNullable(null);
boolean isPresent_1 = optValue_1.isPresent(); //true
boolean isPresent_2 = optValue_2.isPresent(); //false
}
OptionalInt
, OptionalLong
, OptionalDouble
특정 기본형에 대해 성능향상을 위해 존재하는 기본형 값을 감싸는 옵셔널 래퍼클래스
getAsInt()
, getAsLong()
, getAsDouble()
을 통해 가져옴
OptionalInt a = OptionalInt.of(0); //0 저장
OptionalInt b = OptionalInt.empty(); //0 저장
System.out.println(a.isPresent()); //true
System.out.println(b.isPresent()); //false
System.out.println(a.equals(b)); //false
.empty()
를 통해 생성하면, 기본값 0이 저장되겠지만 실제로 0이라는 값을 저장한 것과는 다르다. isPresent()
를 통해 구분할 수 있도록 하자