[Java]Optional 이란?
Optional 이란?
Java8에서는 Optional<T> 클래스를 사용해 NPE를 방지할 수 있게 해준다. Optional<T>는 null이 올 수 있는 값을 감싸는 Wrapper 클래스로, 참조하더라도 NPE가 발생하지 않게 도와준다. Optional 클래스는 아래와 같은 value에 값을 저장하기 때문에 값이 null이더라도 바로 NPE가 발생하지 않고, 클래스이기 때문에 각종 메소드를 제공해준다.
public final class Optional<T> {
private final T value;
}
Optional 활용
-Optional 생성하기
- Optional.empty() - 값이 Null인 경우
Optional은 Wrapper 클래스이기 때문에 값이 없을 수도 있는데, 이때는 Optional.empty()로 생성할 수 있다.
Optinonal<String> optional = Optional.empty();
System.out.println(optional);
System.out.println(optional.isPresent());
Optional 클래스는 내부에서 static 변수로 EMPTY 객체를 미리 생성해서 가지고 있다. 이러한 이유로 빈 객체를 여러 번 생성해줘야 하는 경우에도 1개의 EMPTY 객체를 공유함으로써 메모리를 절약하고 있다.
public final class Optional<T> {
private static final Optional<?> EMPTY = new Optional<>();
private final T value;
private Optional() {
this.value = null;
}
}
- Optional.of() - 값이 Null이 아닌 경우
만약 어떤 데이터가 절대 null이 아니라면 Optional.of()로 생성 가능하다. 만약 Optional.of()로 Null을 저장하려고 하면 NullPointerException이 발생한다.
//Optional의 value는 절대 null이 아니다.
Optional<String> optional = Optional.of("MyName");
- Optional.ofNullbale() - 값이 Null일수도, 아닐수도 있는 경우
만약 어떤 데이터가 null이 올 수도 있고 아닐 수도 있는 경우에는 Optional.ofNullbale로 생성 가능하다. 그리고 이후에 orElse 또는 orElseGet 메소드를 이용해 값이 없는 경우라도 안전하게 값을 가져올 수 있다.
Optional 사용법 예시
- Optional 예시 (1)
기존에는 아래와 같이 null 검사를 한 후 null일 경우 새로운 객체를 생성해주어야 했다. 이런 과정을 코드로 나타내면 다소 번잡해보이는데, Optional<T>와 Lambda를 이용해 해당 과정을 보다 간단하게 표현 가능하다.
//Java8 이전
List<String> names = getNames();
List<String> tempNames = list != null
?list
:new ArrayList<>();
//Java8 이후
List<String> nameList = Optional.ofNullable(getNames())
.orElseGet(() -> new ArrayList<>());
- Optional 예시 (2)
예를 들어 아래와 같은 우편번호를 꺼내는 null 검사 코드가 있다고 하자. 이 코드는 null 검사 댸문에 상당히 복잡하다.
public String findPostCode() {
UserVO userVO = getUser();
if (userVO != null) {
Address address = user.getAddress();
if (address != null) {
String postCode = address.getPostCode();
if (postCode != null) {
return postCode;
}
}
}
return "우편번호 없음";
}
하지만 Optional을 사용하면 이러한 코드를 아래와 같이 표현할 수 있다.
public String findPostCode() {
Optional<UserVO> userVO = Optional.ofNullable(getUser());
Optional<Address> address = userVO.map(UserVO::getAddress);
Optional<String> postCode = adress.map(Address::getPostCode);
String result = postCode.orElse("우편번호 없음");
String result = user.map(UserVO::getAddress)
.map(Address:getPostCode)
.orElse("우편번호 없음");
'Java' 카테고리의 다른 글
[Java] Builder와 Accessors (0) | 2023.06.23 |
---|
댓글