728x90
Optional<T>가 필요한 이유는 아래와 같다.
- null을 직접 다루는 것이 위험하다 -> NullPointerException 발생할 수 있음
- 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
'JAVA' 카테고리의 다른 글
Date, Callender 클래스 LocalDateTime 클래스 + mysql과의 연결 (0) | 2022.09.26 |
---|---|
람다식에 관하여 (0) | 2022.09.23 |
JDBC - Class.forName() (0) | 2022.07.17 |
java공부 - 스케줄러만들기 (수정본) (0) | 2022.05.03 |
java - 행맨 게임 만들기(명품 자바 프로그래밍 8장-Open Challenge) (0) | 2022.04.29 |