Java - Optional

iseon_u·2022년 6월 11일
0

Java

목록 보기
73/77
post-thumbnail

Optional


Optional<T>

  • T 타입 객체의 래퍼클래스
  • null 을 간접적으로 다루기 위한 객체

null 을 직접 다룰 때 문제점

  1. null 을 직접 다루는 것은 위험
    • NullPointerException 발생
  2. null 체크 → if 문 필수 → 코드가 지저분해진다.
  • ✅ 해결책 - Optional 객체 사용
    • 객체에 담아서 간접적으로 null 을 다룬다.
    • → 객체는 항상 null 이 아니다.

Optional<T> 객체 생성하기

String str = "abc";
Optional<String> optVal = Optional.of(str);
Optional<String> optVal = Optional.of(null); // ❌ NullPointerException 발생
Optional<String> optVal = Optional.ofNullable(null); // ✅ OK

  • Optional 객체는 null 값이 될 수 없는 구조
  • 직접 Optional 객체에 null 값 불가
  • 직접 null 값을 넣을려면 ofNullable() 사용
  • 모든 타입의 객체 저장 가능

null 대신 빈 Optional 객체를 사용

Optional<String> optVal = null; // ❌ 바람직하지 않음
Optional<String> optVal = Optional.<String>empty(); 
// ✅ 빈 객체로 초기화
  • NullPointerException 을 줄이기 위해 사용

Optional 객체의 값 가져오기

get() orElse() orElseGet() orElseThrow()

Optional<String> optVal = Optional.of("abc");

// optVal 에 저장된 값을 반환, null 이면 예외 발생
String str1 = optVal.get();

// optVal 에 저장된 값이 null 일 때는, ""를 반환
String str2 = optVal.orElse(""); 

// 람다식 사용 가능 () -> new String()
String str3 = optVal.orElseGet(String::new);

// null 이면 예외 발생 (예외 종류 지정 가능)
String str4 = optVal.orElseThrow(NullPointerException::new);

isPresent()

if(Optional.ofNullable(str).isPresent()) { // if(str!=null)
		System.out.println(str);
}
  • Optional 객체의 값이 null 이면 false, 아니면 true 를 반환

ifPresent()

Optional.ofNullable(str).ifPresent(System.out::println);
  • null 이 아닐때만 작업 수행
  • null 이면 아무 일도 안 함

OptionalInt, OptionalLong, OptionalDouble

public final class OptionalInt {
		private final boolean isPresent; // 값이 저장되어 있으면 true
		private final int value; // int 타입의 변수
  • 기본형 값을 감싸는 래퍼 클래스
  • 성능 향상을 위해 사용

OptionalInt 의 값 가져오기 - int getAsInt()

Optional 클래스값을 반환하는 메서드
Optional<T>T get()
OptionalIntint getAsInt()
OptionalLonglong getAsLong()
OptionalDoubledouble getAsDouble()

빈 Optional 객체와의 비교

OptionalInt opt = OptionalInt.of(0); // 0
OptionalInt opt2 = OptionalInt.empty(); // 0
// 구분 가능?
  • OptionalInt 에 0을 저장
System.out.println(opt.isPresent()); // true
System.out.println(opt2.isPresent()); // false
System.out.println(opt.equals(opt2)); // false
  • isPresent() 로 구별
profile
🧑🏻‍💻 Hello World!

0개의 댓글