
자바는 참조변수에 기본적으로 null을 허용한다.
상황에 따라 null을 사용할 수 있다는 것이 편리는 하지만 참조 변수를 안전하게 사용하기 위해선 null 체크가 필수다. null 체크를 하지 않으면 runtime중에 NullPointException이 언제 던져질지 모른다.
public void savePerson(Person person) {
if(person == null)
thorw new RuntimeException();
repository.save(person);
}
보통 위와 같이 null 체크를 하게 되는데 코드를 지저분하게 만든다.
그래서 대체로 나온 것이 Optional이다.
Optional<T>은 Wrapper 클래스의 일종으로 값이 null일 수 있음을 알려준다.
Optional 생성
기본적으로 생성자는 private로 막아놨다. 대신 정적 팩토리 메서드를 제공한다.
- Optional.empty() : 메서드는 Optional의 내부 value 값을 null로 생성한다.
- Optional.of(value) : 인자를 통해 optional의 내부 value 값을 초기화한다. null을 인자로 받으면 NullPointerException 예외가 발생한다.
- Optional.ofNullable(value) : of()와 같은데 null을 허용한다.
Optional 접근
Optional은 내부의 value를 접근하는 여러 메서드를 제공한다.
- orElse(other) : Optional은 내부의 value를 반환하고, null이면 인자로 받은 other를 반환한다.
- orElseGet(supplier) : Optional은 내부의 value를 반환하고, null이면 인자로 받은 람다식의 결과값을 반환한다.
- orElseThrow() : Optional은 내부의 value를 반환하고, null이면 예외를 던진다. 인자로 예외를 넣을 수 있다.
- get() : Optional은 내부의 value를 반환하고, null이면 NoSuchElementException 예외를 던진다.
참고로 orElse()은 null이 아니더라도 미리 값을 준비 시킨다. 즉 인자로 메서드를 넣게 되면 메서드가 호출이 되는데 상황에 따라 문제가 될 수 있으니 주의해야 한다.
orElseGet()은 값이 null인 경우에만 람다식을 수행한다.
따라서 orElse()보단 orElseGet()를 사용하는 것이 좋겠다.
Optional 상태
- isPresent() : value가 null이 아니면 true를 반환한다.
- isEmpty() : value가 null이면 true를 반환한다.
if(optional.isPresent()) {
return optional.get();
}
else
throw RuntimeException();
Optional에 대해 잘 몰랐을 때 위와 같이 코드를 작성했었다. 굳이 Optional을 사용할 필요가 없는 듯한다.
return optional.orElseThrow(() -> new RuntimeException());
하지만 옵셔널을 적절히 사용하면 위의 코드처럼 단순하게 표현이 가능해진다.
'Java > Basic' 카테고리의 다른 글
Java의 == 와 equals() (0) | 2022.01.14 |
---|---|
ThreadLocal 이란 (0) | 2021.11.01 |
댓글