Optional<T>

2023. 6. 8. 11:09기타

T타입의 객체를 감싸는 래퍼 클래스

public final class Optional<T> {
	private final T value;
	....
}

매번 if문으로 반환된 결과가 null인지 매번 if문으로 체크하는 대신 간단히 처리 가능

Optional 객체 생성

Optional 객체를 생성할 때는 of, ofNullable를 사용한다

String str = "yongcha";
// str이 null이면 nullpointerException 모야 그럼 왜씀.. 알아봐야함 null을 받을 수 없음
Optional<String> value1 = Optional.of(str); 
// str이 null이어도 ""을 반환
Optional<String> value2 = Optional.ofNullable(str); null 가능 ex) Optional.ofNullable(null);

Optional 값 가져오기

value2.get() // 값이 null일 시 NoSuchElementException 거의 사용X
value2.orElse() // 값이 null일때 반환할 값을 지정가능 value2.orElse("empty") 문자열 empty 반환
value2.orElseGet() // orElse를 람다로 표현가능 () -> {} 코드블럭을 사용하기 때문에 로직 사용 가능 
value2.orElseThrow() // 값이 null일때 던질 Exception을 핸들링 가능 람다 사용 () => {}

Optional 값 체크

value2.isPresent() // true false boolean 값으로 
value2.ifPresent() // 값이 있으면 실행하는 로직 () => {} 람다 표

Optional 사용 시 주의점

  1. Optional 변수에 절대 null 할당 금지
Optional<YongUser> findById(Long id) {
	if(result == 0) {
	//	return null; (x)
	  return Optional.empty(); (o)
	}
  1. 값이 있는 경우에 이를 사용하고 없는 경우에 아무 동작도 하지 않는다면, Optional.ifPresent()를 활용할 것
findById(4).ifPresent((user) -> System.out.println(user.getName()))
  1. Optional에서 컬렉션(list, map, set….)을 사용하지 말 것
Optional<List<YongUser>> users; (x)
  1. 기본 타입의 Optional에는 OptionalInt, OptionalLong, OptionalDouble 사용을 고려할 것
OptionalInt maybeInt = OptionalInt.ofNullable(1);
OptionalLong maybeInt = OptionalLong.ofNullable(1L);
OptionalDouble maybeDouble = OptionalDouble.ofNullable(1.0);
  1. Optional은 return 타입에만 사용할 것
public Optional<YongUser> findById(Optional<Yonguser> yonguser) {
	..
} (x)

public Optional<Yonguser> findById(YonguserDTO bean) {
	..
} (o)

public class YongUserDTO {
	private Optional<username> username; (x) 
	
	public YongUserDTO(Optional<username> username) {
		this.username = username
	} (x)
}

Optional 사용법 예시

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 "우편번호 없음";
}
public String findPostCode() {
    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<String> nameOpt = Optional.ofNullable(getName());
String result = nameOpt.orElseThrow(CustomUpperCaseExcpetion::new)
                  .toUpperCase();

이 역시 아래 코드로 축약 가능

'기타' 카테고리의 다른 글

ajax blob 타입 받기  (0) 2023.09.26
java lambda 람다표현식  (0) 2023.06.08
intellj 단축기 정리 (windows)  (0) 2023.04.12