프로그래밍 언어/JAVA(자바)

[자바/java] Optional<T> 클래스란?

냠냠:) 2021. 5. 24. 22:03

개요

JAVA 8 버전부터 등장한 Optional<T>은 "T타입의 객체"를 감싸는 래퍼클래스다

Optional타입의 객체는 모든 타입의 참조변수를 담을 수 있다

 

실제 Optional 클래스 내부

 

특징 

  • 연산의 결과를 Optional객체에 담아서 반환
  • Optional객체에 담아서 반환하면, 반환된 결과가 null인지를 if문으로 체크하지 않고 Optional의 메서드를 통해 처리할 수 있다
  • NPE(NullPointerException)이 발생하지 않는 보다 간결하고 안전한 코드를 작성하는 것이 가능하다

*NPE : NullPointerException

 

 

Optional 객체 생성

1. Optional.of() : 값을 저장. 저장하는 값이 Null이면 NPE를 발생시킨다.

 

2. Optional.ofNullable() : 값을 저장. 저장하는 값이 Null이더라도 NPE가 발생하지 않는다.

 

3. Optional.empty() : Optional<T> 타입의 참조변수를 기본값으로 초기화할 때 사용 (Optional.empty)

String str = "abc";
Optional<String> optVal1 = Optional.of(str);
Optional<String> optVal2 = Optional.ofNullable(str);
Optional<String> optVal3 = Optional.empty();


Optional<String> optVal4 = Optional.of(null);  //  <- NPE

 

 

Optional 객체 값 가져오기

Optional 객체에 저장된 값을 가져오는 방법은 아래와 같이 다양하다

조회 방법 액션
get()  저장된 값 가져오기. Null이면 NoSuchElementException 발생
orElse(T)  저장된 값 가져오기. Null이면 T타입 변수로 대체
orElseGet(lambda)  저장된 값 가져오기. Null이면 lambda가 반환하는 값 반환
orElseThrow()  저장된 값 가져오기. Null이면 예외 발생
orElseThrow(lambda) 저장된 값 가져오기. Null이면 커스텀 예외 발생
ifPresent(lambda) 저장된 값이 있으면, 람다식 실행
ifPresentOrElse(lambda, Runnable)  저장된 값이 있으면, 람다식 실행. 없으면 Runnable.run() 실행

람다식은 https://tosuccess.tistory.com/180?category=853908를 참고해주세요


Optional<String> optStr = Optional.ofNullable("str");
Optional<Integer> optNull = Optional.ofNullable(null);

System.out.println(optNull.get());					//NSE(NoSuchElementException)
System.out.println(optNull.orElse(1234));				//1234
System.out.println(optNull.orElseGet(() -> 5));				//5
System.out.println(optNull.orElseThrow());				//NSE(NoSuchElementException)
System.out.println(optNull.orElseThrow(NullPointerException::new));	//NPE
optStr.ifPresent(System.out::println);					//str
optNull.ifPresentOrElse(System.out::print, new Runnable() {		//?
@Override
public void run() {
System.out.println("?");
}
});

optNull.get()을 했을 때 NSE(NoSuchElementException)이란 예외가 뜨는데, 위에서 설명한 of()에서 뜨는 예외와 같은 예외가 아니다.

 

[예제]

아래와 같이 Optional클래스의 메서드를 사용하여 Null처리를 보다 쉽게 할 수 있다.

String str = "abc";
Optional<String> optStr = Optional.ofNullable("str");

if(str != null) {					//1
	System.out.println(str);
}

optStr.ifPresent(System.out::println);			//2


//abc
//abc

 

 

 

Optional<T>에 대해 간단히 알아봤습니다. 다음에는 JAVA 8 버전에 추가된 스트림에서 Optional을 어떻게 활용하는지에 대해 알아보겠습니다.

 

 

 

 

 

 

[개인 공부를 위한 정리입니다. 참고용으로만 활용하세요]

Reference

Java의 정석 (남궁 성 지음)




반응형