Optional<T>에 관하여

2022. 9. 1. 23:56JAVA

728x90

Optional<T>가 필요한 이유는 아래와 같다.

  1. null을 직접 다루는 것이 위험하다 -> NullPointerException 발생할 수 있음
  2. null 체크하려면 코드가 길어진다.(if문 사용해서 null 체크 해야된다.)

 

=> Optional<T>를 사용하면 항상 null이 아니다.

 

Optional<T> 클라스는 아래와 같다.

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

 

Optional<T>의 메서드들은 아래와 같다.

 

객체 생성

Optional<String> opt = Optional.of("abc");

 

빈 객체로 초기화

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

 

Optional<T> 객체의 값 가져오기

Optional<String> opt = Optional.of("abc");
String str1 = opt.orElse(""); // opt에 저장된 값이 null일 때는, ""를 반환
String str2 = opt.orElseGet(String::new); // 람다식 사용 가능
String str3 = opt.orElseThrow(NullPointerException::new); // 널이면 예외 발생

 

public T orElseThrow() {
        if (value == null) {
            throw new NoSuchElementException("No value present");
        }
        return value;
    }

orElseThrow메소드의 경우 value가 존재하면 T를 리턴하지만, 존재하지 않을 경우에 예외를 발생시킨다.

public Member check(String id) throws NoSuchElementException{
        return memberRepository.findById(id).orElseThrow();
    }

=> DB에 저장되지 않은 회원들을 걸러내기 위해서 orElseThrow()를 사용하였다.

 

ifPresent

public void validDuplicateMember(Member member) throws IllegalStateException{
        memberRepository.findById(member.getUserId())
                .ifPresent(m -> {
                    throw new IllegalStateException("이미 존재하는 회원입니다.");
                });
    }

위 메소드는 회원이 중복되면 IllegalStateException을 throw해주는 것입니다. 

public void ifPresent(Consumer<? super T> action) {
        if (value != null) {
            action.accept(value);
        }
    }

 

T가 존재한다면 action.accept(value)를 실행한다.

 

=> validDuplicateMember(Member member)메소드는 중복 회원을 걸러내기 위해 만들어진 메소드이다. 따라서, validDuplicateMember 메소드에 중복회원이 존재한다면 예외를 발생시키는 ifPresent()메소드를 사용하였다.

 

 public boolean isPresent() {
        return value != null;
    }

isPresnet()메소드의 경우에 value가 존재하냐 하지 않느냐에 따라 boolean 타입으로 리턴값이 정해져 있었기 때문에 중복회원인지를 판단하고 예외를 발생시켜야 하는 상황에서는 ifPresent()메소드가 더 적합하다.

 

 

 

사용한 메서드들을 점점 추가하도록 하겠습니다.

 

728x90