자바 Optional

Chan Young Jeong·2023년 1월 4일
0

All About JAVA

목록 보기
2/10
post-thumbnail

Optional< T >

T 타입 객체의 Wrapper 클래스

public final class Optional<T>{
	private final T value; // T타입의 참조 변수
}
  • 모든 종류의 객체 저장 가능
  • null을 간접적으로 다룰 수 있다.


※null을 직접 다루기에는 위험!

  • NullPointerExeption
  • null을 check해주어야함 -> if문 필요. 코드가 지저분해짐.
String str = null; ( x )
String str = ""; ( o )

int[] arr = null;  ( x )
int[] arr = new int[0]; ( o )

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);

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

Optional<String> optVal = null ; // ok. 하지만 바람직 X
Optoin<String> optVal = Optional.<String>empty() // ( o , <String> 생략 가능)

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

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

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

String str1 = optVal.get(); //optVal에 저장된 값을 반환, null이면 예외 발생. get() 사용하려면 try-catch로 예외 처리 해줘야함.
String str2 = optVal.orElse(""); //optVal에 저장된 값을 반환, null이면 ""을 반환
String str2 = optVal.orElseGet(String :: new); //람다식 사용가능 , String :: new == () -> new String()

isPresent() - Optional객체의 값이 null이면 false,아니면 true 반환

// 1번 방식
if(Optional.ofNullable(str).isPresent()){ // if(str!=null)
	System.out.println(str);
}

// 2번 방식 ifPresent(Consumer) null이 아닐때만 작업 수행, 널이면 아무 일도 안 함
Optional.ofNullable(str).ifPresent(System.out::println);

OptionalInt, OptionalLong, OptionalDouble

기본형 값을 감싸는 래퍼 클래스, 성능을 높이기 위해 사용함.

public final class OptionalInt{
	private final boolean isPresent; // 값이 저장되어 있으면 true
	private final int value ; // int 타입의 변수
}

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

빈 Optional객체와의 비교

OptionalInt opt = OptionalInt.of(0); 
OptionalInt opt2 = OptionalInt.empty();

System.out.println(opt.getAsInt()); //0
System.out.println(opt2.getAsInt()); // NoSuchElementException

System.out.println(opt.isPresent()); // true
System.out.println(opt2.isPresent()); // false
System.out.println(opt.equals(opt2)); // false

참고자료

0개의 댓글