Java

146. Optional<T> - 패스트캠퍼스 백엔드 부트캠프 3기

gkss2tpt 2025. 1. 12. 12:14

1. Optional<T>

  • T타입 객체의 래퍼클래스 - Optional<T>
public final class Optional<T> {
    private final T value;	// T타입의 참조변수
}
  • Optional<T> 객체를 생성하는 다양한 방법
String str = "abc";
Optional<String> optVal = Optional.of(str);
Optional<String> optVal = Optional.of("abc");
Optional<String> optVal = Optional.of(null);		// NullPointerException발생
Optional<String> optVal = Optional.ofNullable(null);	// OK
  • null대신 빈 Optional<T> 객체를 사용하자
Optional<String> optVal = null;	// null로 초기화 바람직하지않음
Optional<String> optVal = Optional.empty();	// 빈 객체로 초기화
  • 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()) { // if(str!=null)
    System.out.println(str);
}

// ifPresent(Consumer) - 널이 아닐때만 작업 수행, 널이면 아무 일도 안 함
Optional.ofNullable(str).ifPresent(System.out::println);
	Optional<String> opt = Optional.ofNullable(null);
        Optional<String> opt2 = Optional.of("AAA");

        System.out.println(opt);    // Optional.empty
        System.out.println(opt2);   // Optional[AAA]

        opt.ifPresent(System.out::println);     // opt가 null이면 실행 안됨
        opt2.ifPresent(System.out::println);    // AAA

        String str = null;
        String str2 = "abc";
        
        if (Optional.ofNullable(str).isPresent()) {     // str이 null이라 false
            System.out.println(str);
        }
        if (Optional.ofNullable(str2).isPresent()) {    // str2는 abc
            System.out.println(str2);
        }

        str = opt.orElse("EMPTY");   // Optional에 저장된 값이 null이면 "EMPTY"반환
        System.out.println(str);        // EMPTY

        str2 = null;
        str2 = opt.orElseGet(String::new);
        System.out.println(str2);

 

2. OptionalInt, OptionalLong, OptionalDouble - 성능 상승(Optional<T>보다)

  • 기본형 값을 감싸는 래퍼클래스
public final class OptionalInt{
    ...
    private final boolean isParesent;	// 값이 저장되어 있으면 true
    private final int value;		// int타입의 변수
}
Optional클래스 값을 반환하는 메서드
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 값이 저장되어 있으면 true
System.out.println(opt2.isPresent());	// false 
System.out.println(opt.equals(opt2));	// false 빈값과 0은 다름

 

3. 예제

	Optional<String> optStr = Optional.of("abcde");
        Optional<Integer> optInt = optStr.map(String::length);
        //optStr.map(s->s.length());
        System.out.println("optStr="+optStr.get());     // optStr=abcde
        System.out.println("optInt="+optInt.get());     // optInt=5

        int result1 = Optional.of("123")
                    .filter(x->x.length() > 0)
                    .map(Integer::parseInt).get();
        // .map(s->Integer.parseInt(s));

        int result2 = Optional.of("")
                    .filter(x->x.length() > 0)  // filter가 false일 경우 Optional.empty() 빈 옵셔널을반환
                    .map(Integer::parseInt).orElse(-1); // orElse가 Optional이 비었는지 체크 비었으면 기본값 반환

        System.out.println("result1="+result1); // result1=123
        System.out.println("result2="+result2); // result2=123

        Optional.of("456").map(Integer::parseInt)
                .ifPresent(x -> System.out.printf("result3=%d%n",x));   // result3=456

        OptionalInt optInt1 = OptionalInt.of(0); // 0을 저장
        OptionalInt optInt2 = OptionalInt.empty();  // 빈 객체를 생성

        System.out.println(optInt1.isPresent());    // true
        System.out.println(optInt2.isPresent());    // false

        System.out.println(optInt1.getAsInt());     // getAsInt() 값을 반환하는 메서드
//        System.out.println(optInt2.getAsInt());     // 빈 문자열을 반환해서 NoSuchElementException발생
        System.out.println("potInt1="+optInt1);
        System.out.println("potInt2="+optInt2);
        System.out.println("optInt1.equals(optInt2)"+optInt1.equals(optInt2));