본문 바로가기
JAVA

[JAVA]Optional

by whitedeveloper 2023. 1. 12.

#.optional<T>

-null이 올 수 있는 값을 감싸는 wrapper클래스

-null을 참조하더라도 NPE(NullPointException)이 발생하지 않도록 해준다.

 

 

1.Optional.empty() - null인 경우

-Optional은 Wrapper클래스이기 때문에 값이 없을 수도 있다.

-이 경우에 Optional.empty()을 활용하면 된다.

Optional<String> s = Optional.empty();

System.out.println(s); //Optional.empty() = null
System.out.println(s.isPresent()); //null이기 때문에 false

 

2.Optional.of() - 값이 null이 아닌 경우

-데이터가 절대 null이 아니라면 Optional.of()로 생성할 수 있다.

-Optional.of()로 Null을 저장하려고 하면 NPE가 발생한다. 

 

 

3.Optional.ofNullable() - 값이 null일 수도, 아닐 수도 있는 경우

-데이터가 null이 올 수 도 있고, 아닐 수도 있는 경우 .Optional.ofNullable로 생성할 수 있다.

-이 후 orElse 또는 orElseGet 메소드를 이용해서 값이 없는 경우라도 값을 가져올 수 있다.

Optional<String> optional = optional.ofNullable(getName());  //optional값이 null 일 수도 아닐 수도

String name = optional.orElse("anonymous"); //값이 없다면 "anonymous"를 리턴

 예시)

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로 펼쳐놓으면 아래와 같다.
    Optional<UserVO> userVO = Optional.ofNullable(getUser());
    Optional<Address> address = userVO.map(UserVO::getAddress);
    Optional<String> postCode = address.map(Address::getPostCode);
    String result = postCode.orElse("우편번호 없음");

    // 그리고 위의 코드를 다음과 같이 축약해서 쓸 수 있다.
    String result = user.map(UserVO::getAddress)
        .map(Address::getPostCode)
        .orElse("우편번호 없음");
}

이름을 대문자로 변경하는 코드

String name = getName();
String result = "";

try {
    result = name.toUpperCase();
} catch (NullPointerException e) {
    throw new CustomUpperCaseException();
}

Optional적용

Optional<String> nameOpt = Optional.ofNullable(getName());
String result = nameOpt.orElseThrow(CustomUpperCaseExcpetion::new)
                  .toUpperCase();