Optional이란?

2021. 1. 16. 19:50JAVA

Optional이란?

Null값을 참조하여 NullPointException이 나는 것을 방지하기 위해 Null Check를 했던 예전코드를 보안하기 위해 자바8에서 지원하는 Class. 객체를 Optional로 한번 감싸 준다. -> 쉽게 null safe하게 만들 수 있다.

 

기존코드

Member member = new Member("빙구", 33);

if(member.getAddress() != null) {
	System.out.println(member.getAddress());
}

저렇게 null check를 해줘야 한다.

 

Optional 목적

NullPointException이 나지않게 방어해주며, 해당 객체가 null일 경우에 대한 방안을 유도한다.

 

Optional 사용법

  • 1. Optional은 리턴타입에만 ofNullable로 사용할것은 권장한다.

public Optional<String> getAddress() {
	return Optional.ofNullable(address);
}

ofNullable은 해당 객체가 null이 아니면 해당 객체를 감싸서 리턴하고, null인 경우 null을 감싸서 리턴한다.

 

클라이언트 코드에서는 리턴받은 객체가 null일 경우에 방안을 제시할 수 있다.

Member member = new Member("빙구", 33);
String address = member.getAddress().orElseGet(String::new);

 

이렇게만 사용하길 권장하는 이유는, Optional타입으로 변수를 지정하여 사용하면, 어디서든 Optional 자체가 null이 될 수 있기때문에 Optional자체를 다시 null 체크해야하는 기존 코드와 다를바가 없어진다. 

 

  • 2. primitive 타입은 Optional이 아닌 OptionalInt, OptionalDouble, OptionalLong을 사용하자.

boxing과 unboxing의 쓸데없는 연산을 줄일 수 있다.

 

Optional API

 

  • Optional 만들기

Optional.of() -> 비권장사항. 생성된 객체가 null일 경우 NullPointException이 나온다.

Optional.ofNullable()

Optional.empty()

 

  • Optional에 값이 있는지 없는지 확인하기

isPresent()

isEmpty() (Java 11부터 제공)

 

  • Optional에 있는 값 가져오기

get() -> 비권장사항. 그냥 get하면 해당 객체가 null일 경우 다시 null체크를 해줄텐가? 그러지말고 아래에 있는 ifPresent, orElse, orElseGet, orElseThrow를 적극 활용하자.

 

  • Optional에 객체가 null일때 방안마련하기

ifPresent(Consumer) -> Optional안에 null이 아닌 객체에 대해서만 적용

orElse(T) -> Optional안에 객체가 null이 아니면 가져오고 null이면 이미 생성된 객체로 대체할때 사용. null일 경우 new로 객체를 새로 생성하여 리턴할 경우, null이 아닐때도 계속 new로 객체를 생성하기 때문에 new로 객체를 생성하는것은 안티패턴! new로 새로 생성하려면 orElseGet을 사용해라.

orElseGet(Supplier) -> Optional안에 객체가 null이 아니면 가져오고 null이면 새로운 객체를 생성할때 사용.

orElseThrow() -> Optional안에 객체가 null이 아니면 가져오고 null인데 아무 방안이 없으면 새로운 에러를 생성할때 사용.

 

  • Optional에 들어있는 값 걸러내기

Optional filter(Predicate)

 

  • Optional에 들어있는 값 변환하기

Optional map(Function)

Optional flatMap(Function): Optional 안에 들어있는 인스턴스가 Optional인 경우에 사용하면 편리하다.