[Java] Optional - Wrapper Class

호호빵·2022년 12월 29일
0

Java

목록 보기
14/19

Optional

1. 만들어진 이유와 의도

  • null을 반환하면 오류가 발생할 가능성이 매우 높은 경우에 '결과 없음'을 명확하게 드러내기 위해 메소드의 반환 타입으로 사용되도록 매우 제한적인 경우로 설계됨.


2. Optional 개념

  • Java8부터 Null이나 Null이 아닌 값을 저장하는 컨테이너 클래스(Wrapper Class)로 추가됨
    -> NPE 방지

    NPE(NullPointerExceotion) - 런타임예외

    • 프로그램이 null 값으로 설정된 개체 참조를 사용하려고하면이 예외가 throw
    • NPE를 피하려면 null 여부를 검사해야 하는데, null 검사를 해야하는 변수가 많은 경우 코드가 복잡해지고 번거로움.
    • 그래서 null 대신 초기값을 사용하길 권장함
  • 아래와 같은 value에 값을 저장하기 때문에 값이 null이더라도 바로 NPE가 발생하지 않음.
public final class Optional<T> {

    private static final Optional<?> EMPTY = new Optional<>();
    private final T value;
    
    private Optional() {
        this.value = null;
    }
    ...
}


3. 실제 사용 예시

# UserRepository

public interface UserRepository extends JpaRepository<User, Long> {
    Optional<User> findByUsername(String username);
}



# UserService

@Transactional
    public void signup(SignupRequest request) {
        String username = request.getUsername();
        String password = request.getPassword();

        Optional<User> found = userRepository.findByUsername(username);
        if (found.isPresent()) {
            throw new IllegalArgumentException("중복된 이름이 있습니다.");
        }
		// username 으로 찾았을 때 null 값이 나올 수도 있기때문에 Optional 사용
 		// Optional 클래스의 메소드 isPresen() 사용
 


        UserRoleEnum role = UserRoleEnum.USER;

        if (request.isAdmin()) {
            if (!request.getAdminToken().equals(ADMIN_TOKEN)) {
                throw new IllegalArgumentException("관리자 암호가 틀려 등록이 불가능합니다.");
            }
            role = UserRoleEnum.ADMIN;
        }

        User user = new User(username, password, role);
        userRepository.save(user);
    }


올바른 사용 가이드

  • Optional 변수에 Null을 할당하지 말아라
  • 값이 없을 때 Optional.orElseX()로 기본 값을 반환하라
  • 단순히 값을 얻으려는 목적으로만 Optional을 사용하지 마라
  • 생성자, 수정자, 메소드 파라미터 등으로 Optional을 넘기지 마라
  • Collection의 경우 Optional이 아닌 빈 Collection을 사용하라
  • 반환 타입으로만 사용하라

더 알아보기

  • 잘못 사용했을 때의 side effect, 올바르게 사용해야 하는 이유





Optional 개념과 올바른 사용법

profile
하루에 한 개념씩

0개의 댓글

관련 채용 정보