Optional
Java8부터 Optional <T> 클래스를 사용해 NPE(Null Pointer Exception)을 방지할 수 있다.
만약 null이면 안 되는 어떤 값을 검사해야 할 때, if 문들 사용해서
"null일 때는 어떻게 하고~ null이 아니면 어떻게 하고~"를 일일이 작성해야 하는 불편함이 있었다.Optional <T>을
사용하면 이 부분의 코드를 간결하게 바꿀 수 있다.
Optional 이란?
Optional<T>는 null이 올 수 있는 값을 감싸는 Wrapper 클래스이다.
Optional로 설정된 값을 참조하더라고 NPE가 발생하지 않도록 도와준다.
즉, 예상치 못한 NPE 예외 발생을 피할 수 있어 권장되는 방법이라고 한다.
Optional 객체 생성
of()
또는 ofNullable()
을 사용해서 Optional 객체를 생성할 수 있다.
1) ofNullable()
- Null이 발생할 가능성이 있는 경우에 ofNullable()을 통해 생성하면, NPE를 발생시키지 않는다.
- value의 값이 null인 경우
Optional.empty()
가 반환된다.
Optional<String> optional = Optional.ofNullable(value);
2) of()
- 이 경우에는 value의 값이 null인 경우 NPE에러가 발생한다.
- 따라서 반드시 값이 있어야 하는 경우에 사용한다.
Optional<String> optional = Optional.of(value);
Optional의 기능을 남용하는 것은 좋지 않다.
따라서 만약 값이 존재할 때만 동작하는 로직이 있거나, 어떤 값은 반드시 존재한다면, of()
로 생성하는 것이 좋다.
3) Optional.empty()
- 생성할 때 비어있는 객체로 생성할 수도 있다.
Optional<String> optional = Optional.empty();
4) 생성 예제
String str = "hello";
String nullStr = null;
//1. not-null 값을 ofNullable()로 생성
Optional<String> op1 = Optional.ofNullable(str);
System.out.println(op1);
//2. null 값을 ofNullable()로 생성
Optional<String> op2 = Optional.ofNullable(nullStr);
System.out.println(op2);
//3. Optional.empty()로 생성
Optional<String> op3 = Optional.empty();
System.out.println(op3);
//4. null 값을 of()로 생성
Optional<String> op4 = Optional.of(nullStr);
System.out.println(op4);
- Optional [hello] 출력
- Optional.empty 출력
- Optional.empty 출력
NullPointerException
예외 발생
Methods
1) get()
- Optional 객체에 들어있는 값을 반환한다. (정확히는 Wrapper 클래스인 Optional을 unboxing 하는 메서드이다.)
- 만약 Optional 객체에 값이 들어있지 않으면
NoSuchElementException
예외가 발생한다.
위의 예제에서도 볼 수 있듯이, Optional 객체를 직접 반환하면 Optional [hello]와
같이 반환된다.
Optional로 Wrapping 된 값을 가져오려면 get()
메서드를 이용하여 값을 꺼내야 한다.
2) isPresent()
- Optional 객체에 값이 존재하면
true
, 그렇지 않으면false
를 반환한다.
3) isEmpty()
- Optional 객체에 값이 존재하지 않으면
true
, 그렇지 않으면false
를 반환한다.
4) orElse()
orElse(T)
로 지정된 값이 존재하면 그 값을 반환하고, 그렇지 않으면 Optional로 전달된 값을 반환한다.
String str = "hello";
String nullStr = null;
String str1 = Optional.ofNullable(str);
String str2 = Optional.ofNullable(nullStr).orElse("hi");
// str1 : hello , str2 : hi
5) orElseThrow()
- 값이 존재하면 그 값을 반환하고, 그렇지 않으면 예외를 던진다.
- 람다식을 이용한다.
xxxRepository.findById(userId)
.orElseThrow( () -> new NoSuchElementException() );
반응형
'JAVA & Spring' 카테고리의 다른 글
[JAVA] 람다식과 스트림 Stream() (0) | 2023.05.25 |
---|---|
[JAVA] 파일 입출력 (2) | 2023.05.19 |
[Java] StringTokenizer (0) | 2023.05.04 |
[Java] String 클래스, 관련 메소드 (0) | 2023.04.20 |
[JAVA] Object 클래스_toString() 메서드 (0) | 2023.02.05 |