Spring-Java/Java

Optional 클래스

현대타운301 2024. 4. 5. 02:08

 

Optional?

 

Optional<T>

Integer 혹은 Double과 같이 객체 T를 포장(wrap)해주는 래퍼 클래스입니다.

자바의 NullPointException(NPE)을 조금 더 세련되게 처리할 수 있도록 도와줍니다.

 


 

객체 생성

 

of() 메소드나 ofNullable() 메소드를 통해 객체를 생성합니다.

타입에는 <T> / int / long / double 등이 있습니다.

Optional<T> : 객체 T
OptionalInt : int
OptionalLong : long
OptionalDouble : double

 

 

of( )

null이 아닌 명시된 값을 가지는 Optional 객체를 반환합니다.

만약 of() 메소드를 통해 생성된 Optionla 객체에 null이 저장되면 NPE가 발생합니다.

 

 

ofNullable( )

명시된 값이 null이 아니면 명시된 값을 가지는 Optional 객체를 반환하고,

만약 null인 경우에는 비어있는 Optional 객체를 반환합니다.

 

Optional<String> obj = Optional.ofNullable("Optional 객체");
System.out.println(obj.get())	// 실행결과 : Optional 객체

 


 

객체 접근

 

Optional 객체의 값을 얻기 위해서는 아래와 같은 메소드들을 호출합니다.

get() : 객체 T
getAsInt() : int
getAsLong() : long
getAsDouble() : double

 

 

하지만 객체 접근 전에 null 여부 판단이 선행되어야 안전하게 값을 가져올 수 있습니다.

다음과 같은 메소드들을 활용해 null 여부를 판단합니다.

 

 

isPresent( )

값의 존재 여부를 판단해 true 혹은 false를 반환합니다.

 

OptionalDouble optional = stream.average();

if(optional.isPresent()) {
	System.out.println("평균 : " + optional.getAsDouble());
} else {
	System.out.println("평균 : 0.0");
}

// 하지만 이와 같이 여부를 판단하는 것은 지양해야 하는 패턴인 '안티패턴'으로 불림
// ifPresent() 메소드를 활용하기를 권장

 

 

orElse( )

저장된 값이 없다면 인자로 전달된 default 값을 반환합니다.

orElse(T) : 객체 T
orElse(int) : int
orElse(long) : long
orElse(double) : double

 

// 집계값이 없다면 avg는 default 값인 0.0
double avg = stream.average().orElse(0.0);

 

 

orElseGet( )

저장된 값이 없을 경우 인자로 전달된 람다 표현식의 결과를 반환합니다.

 

 

orElseThrow( )

저장된 값이 없을 경우 인자로 전달된 예외를 발생시킵니다.

 

 

ifPresent( )

제공된 Comsumer 람다식을 저장된 값이 있을 경우에만 실행시킵니다.

리턴 타입은 void입니다.

 

// 집계 값이 있는 경우 출력문 실행
stream.average().ifPresent(a -> System.out.println("평균 : " + a));

 

 

 

* refs

https://www.tcpschool.com/java/java_stream_optional