-
[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)
'Java' 카테고리의 다른 글
[JAVA] 어떤 Stream은 sum()을 쓰고 어떤 Stream은 sum()을 못쓰는 이유 (0) 2022.12.02 [JAVA] 숫자 Stream 조건걸고 만드는 여러가지 방법 (0) 2022.12.01 [JAVA] String 변수 값이 같은지 확인할 때는 equals()를 사용하자(쓰지마 ==) (0) 2022.11.23 [JAVA] Scanner nextInt()는 '엔터'를 인식할 수 없다 (0) 2022.11.23 [JAVA] 변수 타입 확인하기 (0) 2022.11.23