ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [JAVA] null 예외를 깔끔하게 해주는 Optional 클래스
    Java 2022. 12. 1. 11:37

    Optional을 쓰는 이유

    객체를 다룰 때 언제든지 null이 발생할 일은 있다. NullPointerException이 발생하면 이것을 하나하나 try/catch문으로 예외처리를 해줘야 한다. 이런 예외처리를 다 if문, try/catch문을 남발하며 잡아주면 코드 가독성이 떨어지고 또 다른 디버깅의 위험을 초래할 수 있다.

    그래서 나온 Optional은 null이 발생하는 일을 근본적으로 없애줄 대안을 제시한다.


    Optional을 쓰는 방식

    null이 나올 수 있는 변수를 애초에 Optional 객체에 담아버림으로서, Optional 클래스의 메소드를 통해 null을 대체할 것(value)을 준비해서 리턴해준다. 메서드의 종류는 여러가지가 있다.

     

    Optional.of() : 괄호 안에 null을 대체할 값을 반드시 넣어주어서, 그 값을 변수에 담아준다. null을 넣으면 NullPointerException이 발생한다.

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

     

    Optional.ofNullable(null) : Optional.of에서는 null을 넣을 수 없었지만 이 메소드에서는 가능하다. 

    Optional<String> optVal = Optional.ofNullable(null);
    System.out.println(optVal); // Optional.empty

    Optional.empty() : null을 넣고싶을 때 쓸 수 있는 또하나의 메서드. 빈 객체를 만들어준다.

    Optional<String> optVal = Optional.empty();
    System.out.println(optVal); // Optional.empty

    .get() : (잘 안씀) Optional 객체에 저장된 값을 반환해준다. 하지만 value가 null이면 NoSuchElementException 예외가 발생한다.

    Optional<String> optVal = Optional.empty();
    System.out.println(optVal.get()); // NoSuchElementException

     

    .orElse('abc') : Optional 객체에 저장된 값을 반환한다. 만약 value가 null이면 orElse 괄호 안에 넣은 값을 반환해준다.

    Optional<String> optVal = Optional.empty();
    System.out.println(optVal.orElseGet('abc'); // abc

    .orElseGet(()-> new String('123')) : orElse와 같지만 괄호 안에 객체를 반환하도록 람다식을 넣어줘야 한다.

    Optional<String> optVal = Optional.empty();
    System.out.println(optVal.orElseGet(()-> new String("123"))); // 123

    .orElseThrow(()-> new NullPointerException()) : (잘 안씀).get()과 비슷하다. 다른점은 괄호 안에 Exception을 내가 원하는 것으로 뜨도록 정할 수 있다.

    Optional<String> optVal = Optional.empty();
    System.out.println(optVal.orElseThrow(()-> new NullPointerException()));
    // NullPointerException 에러가 발생한다.

    .isPresent() : Optional 객체의 값이 null이면 false, 아니면 true를 반환한다.

    Optional<String> optVal = Optional.of("1234");
    System.out.println(optVal.isPresent()); // true
    
    Optional<String> optVal = Optional.empty();
    System.out.println(optVal.isPresent()); // false

     

    ifPresent() : null 이 아닐때만 작업을 수행한다.

    Optional<String> optVal = Optional.empty();
    optVal.ifPresent(a-> System.out.println(a)); // 실행 안함
    
    Optional<String> optVal = Optional.of('abc');
    optVal.ifPresent(a-> System.out.println(a)); // abc

    OptionalInt / OptionalLong / OptionalDouble : String 값이 아닌 int/long/double 값을 넣어줄 땐 이것을 써준다.

    int OptionalInt = OptionalInt.of(1)

     

Designed by Tistory.