Optional

뾰족머리삼돌이·2023년 12월 20일
0

JAVA

목록 보기
4/8

Optional<T>

자바8에서 추가된 클래스로 null과 관련하여 NullPointerException 을 방지하는데 사용된다
기본적으로 대상을 감싸는 Wrapper 클래스이다

메서드의 리턴타입에 사용되는 것을 목적으로 개발된 클래스이다

public Optional<String> getEmail(){
return Optional.ofNullable(this.email);
}

해당 메서드를 사용하는 대상에게 리턴값이 없을수도 있다는 사실을 알려준다


등장배경

String name= user.getName();
if(name != null){
    if(name.contains("zamong")){
        System.out.println("안녕 " + name + " !!");
    }
}

자바 8이전에는 null을 체크하기 위해 if문을 이용했다
따라서 사용하는 클라이언트가 직접 null체크를 수행하거나 제공하는 쪽에서 null체크를 수행해야 헀다

Exception을 발생시키는 경우,
Checked Exception의 경우 컴파일 단계에서 알려줄 수 있지만 Exception 핸들링을 강제하고
UnChecked Exception의 경우 따로 Handler를 만들어서 해결할 수 있지만 공통적으로 stacktrace를 찍기때문에 자원이 소비된다는 단점이 있다


사용 시 주의사항

  1. return 타입으로만 사용하는 것을 권장

  2. Optional을 반환하는 메서드에서 null을 반환하면 안됨

  3. 기본형 값은 전용 Optional을 사용

    • OptionalLong, OptionalInt ...
  4. 값의 유무를 판단이 가능한 인스턴스는 사용하지 말자

    왜 리턴타입일까?
    Optional이 사용될 수 있는 다른 위치를 알아보자

    1. 파라미터
      파라미터의 경우 Optional 자체가 null이 될 가능성이 있다
    2. 필드
      필드값이 없을수도 있다는 것은 설계자체에 문제가 있을 가능성이 있다
    3. map의 key
      map의 key가 없을수도 있다는 것은 map의 설계 목적에 어긋난다

    사용예시

    public class Console {
        public static void main(String[] args) {
            User user = new User();
            Optional<String> optionalTest= user.getEmail();
    
            Optional<String> ofValue = Optional.of("of"); 
            // 값이 비어있을 수 있는 optional을 생성한다
    
            Optional<String> nullableValue = Optional.ofNullable(null);
            // 값이 비어있거나 null일 수 있는 optional을 생성한다
    
            optionalTest.isPresent(); // 값이 있는지를 boolean으로 반환
            optionalTest.isEmpty(); // 값이 없는지를 boolean으로 반환
    
            optionalTest.get(); // optional 안의 값을 반환, 값이 없다면 NoSuchElementException을 발생시킨다
    
            optionalTest.ifPresent(System.out::println); // 값이 있을때, 수행할 작업을 지정한다
            optionalTest
                    .ifPresentOrElse(System.out::println, () -> System.out.println());
                    // 값이 있을때 수행할 작업과 없을때 수행할 작업을 모두 지정한다
    
            Optional<String> or = optionalTest
                    .or(() -> Optional.ofNullable(ifEmpty()));
                    // 값이 없을 경우 반환할 값이나 수행할 작업을 Optional로 감싸서 반환한다
                    // 값이 있다면 수행되지 않는다 ( 자바 9에서 추가 )
    
            String email = optionalTest
                    .orElse(ifEmpty());
                    // 값이 없을경우 반환할 값을 지정한다
                    // 반환할 값이 메서드라면, 값이 있더라도 수행된다
    
            email = optionalTest
                    .orElseGet(() -> {
                        System.out.println("default@email.com");
                        return "default@email.com";
                    });
                    // 값이 없을경우 반환할 값이나 수행할 작업을 지정한다
                    // 반환할 값이 메서드라면, 값이 없어야만 수행된다
    
            optionalTest.orElseThrow();
            // 값이 없을경우 NoSuchElementException 을 던진다
    
            optionalTest.orElseThrow(IllegalStateException::new);
            // 값이 없을경우 지정한 Exception을 던진다
    
        }
    
        public static String ifEmpty(){
            System.out.println("값이 없었다네요~~");
            return "default@email.com";
        }
    
    }

0개의 댓글