본문 바로가기

프로그래밍/JAVA

[ JAVA ] Optional<T>와 OptionalInt

public final class Optional<T> {
    private final T value; // T타입의 참조변수
    ...
}
▶ Optional<T>은 지네릭 클래스로 'T타입의 객체'를 감싸는 래퍼 클래스이다.
▶ Optional타입의 객체에는 모든 타입의 참조변수를 담을 수 있다.
▶ 최종 연산의 결과를 Optional객체에 담아서 반환하여 Optional에 정의된 메서드를 통해 null체크를 간단히 처리할 수 있다.

① Optional객체 생성하기

▶ Optional객체를 생성할 때는 of() 또는 ofNullable()을 사용한다.
▶ empty() : Optional<T>타입의 참조변수를 기본값으로 초기화할 떄 사용한다.
// Optional 객체 생성
String str = "abc";
Optional<String> optVal = Optional.of(str);
Optional<String> optVal = Optional.of("abc");
Optional<String> optVal = Optional.of(new String("abc"));

// 만일 참조변수의 값이 null일 가능성이 있으면, ofNullable()을 사용해야한다.
Optional<String> optVal = Optional.of(null); // NullPointerException 발생
Optional<String> optVal = Optional.ofNullable(null); // OK

// Optional<T>타입의 참조변수를 기본값으로 초기화
// null로도 초기화 가능하지만, empty()로 초기화 하는 것이 바람직함.
Optional<String> optVal = null; // null로 초기화
Optional<String> optVal = Optional.<String>empty(); // 빈 객체로 초기화

② Optional 객체의 값 가져오기

▶ get() : Optional객체에 저장된 값을 가져올 때 사용한다.
▶ get()으로 가져온 값이 null일 때는 NoSuchElementException이 발생하며, 이를 대비해서 orElse()로 대체할 값을 지정할 수 있다.
▶ orElseGet() : null을 대체할 값을 반환하는 람다식을 지정할 수 있다.
▶ orElseThrow() : null일 때 지정된 예외를 발생시킨다.
▶ Optional객체에도 filter(), map(), flatMap()을 사용할 수 있으며, map()의 연산결과가 Optional<Optional<T>>일 때, flatMap()을 사용하면 Optional<T>를 결과로 얻는다.
▶ isPresent() : Optional객체의 값이 null이면 false, null이 아니면 true를 반환한다.
▶ ifPresent(Consumer<T> block) : 값이 있으면 주어진 람다식을 실행하고, 없으면 아무 일도 하지 않는다.

< Stream클래스에 정의된 메서드 중에서 Optional<T>를 반환하는 메서드 >

메서드
Optional<T> findAny()
Optional<T> findFirst()
Optional<T> max(Comparator<? super T> comparator)
Optional<T> min(Comparator<? super T> comparator)
Optional<T> reduce(BinaryOperator<T> accumulator)

③ OptionalInt, OptionalLong, OptionalDouble

▶ 기본형 스트림에는 Optional도 기본형을 값으로 하는 OptionalInt, OptionalLong, OptionalDouble을 반환한다.
▶ Optional<T>와 기본형 Optional에 저장된 값을 꺼낼 때 사용하는 메서드의 이름이 조금씩 다르다.
Optional 클래스 값을 반환하는 메서드
Optional<T> T get()
OptionalInt int getAsInt()
OptionalLong long getAsLong()
OptionalDouble double getAsDouble()
// int의 기본값인 0으로 초기화한 optionalInt 객체와 0을 저장한 optionalInt 객체 비교
OptionalInt opt = OptionalInt.of(0);    // OptionalInt에 0을 저장
OptionalInt opt2 = OptionalInt.empty(); // OptionalInt에 0을 저장

// 저장된 값이 없는 것과 0이 저장된 것은 isPresent라는 인스턴스 변수로 구분 가능
System.out.println(opt.isPresent()); // true
System.out.println(opt2.isPresent()); // false
System.out.println(opt.getAsInt()); // 0
System.out.println(opt2.getAsInt()); // NoSuchElementException 예외발생
System.out.println(opt.equals(opt2)); // false

// Optional 객체의 경우 null을 저장하면 비어있는 것과 동일하게 취급한다.
Optional<String> opt = Optional.ofNullable(null);
Optional<String> opt2 = OPtional.empty();
System.out.println(opt.equals(opt2)); // true

'프로그래밍 > JAVA' 카테고리의 다른 글

[ JAVA ] 문자기반 스트림  (0) 2023.04.10
[ JAVA ] 바이트기반의 보조스트림  (0) 2023.04.10
[ JAVA ] 스트림(stream) - ②  (0) 2023.03.19
[ JAVA ] 스트림(stream) - ①  (0) 2023.03.19
[ JAVA ] 쓰레드의 실행제어  (0) 2023.02.26