14-35~39 Optional

oyeon·2021년 3월 22일
0

Java 개념

목록 보기
69/70

Optional<'T'>

public final class Optional<T>{
    private final T value;	// T타입의 참조변수(모든 종류의 객체 저장 가능)
    		...
}

필요 이유

  1. null을 직접 다루는 것은 위험하다. (NullpointerException)
  2. null 체크를 하려면 If문이 필수이므로 코드가 지저분해진다.

-> 간접적으로 null을 다룬다. 다루고 있는 객체의 null값을 Optional 객체 안에 넣는다.

Optional<'T'> 객체 생성하기

Optionnal<'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
  • Optional 객체로 한 단계를 더 거치게 하면 0x100이 null이더라도 NullPointerException이 나지 않는다. (0x200은 null이 될 수 없다.)

null 대신 빈 Optional<'T'> 객체를 사용하자

Optional<String> optVal = null;	// 널로 초기화. 바람직하지 않음
Optional<String> optVal = Optional.empty(); // 빈 객체로 초기화. 바람직.

Optional<'T'> 객체의 값 가져오기

Optional 객체의 값 가져오기 - get(), orElse(), orElseGet(), orElseThrow()

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

// optVal에 저장된 값을 반환. null이면 예외 발생.
// 예외 처리 해야하므로 거의 사용 X
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() - Optional 객체의 값이 null이면 false, 아니면 true를 반환

if(Optional.ofNullable(str).isPresent()) { // if(str != null)
	System.out.println(str);
}
- 아래와 같이 작성할 수도 있다.
// ifPresent(Consumer) - Null이 아닐때만 작업 수행, Null이면 아무일도 안함
// System.out::println == (v) -> (System.out.println(v))
Optional.ofNullable(str).ifPresent(System.out::println);

OptionalInt, OptionalLong, OptionalDouble

기본형 값을 감싸는 wrapper 클래스

  • 성능때문에 사용
public final class OptionalInt{
	...
    	private final boolean isPresent; // 값이 저장되어 있으면 true
        private final int value;	 // int 타입의 변수
}

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

빈 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.println(opt.equals(opt2));	// false
profile
Enjoy to study

0개의 댓글