개발을 할 때 가장 많이 발생하는 예외 중 하나가 바로 NullPointerExeption이다
이 NPE를 피하려면 null 여부를 검사해야하는데,
null 검사를 해야하는 변수가 많은 경우 코드가 복잡해지고 번거롭다
그래서 Java 8 버전부터 등장한 것이 Optional 클래스이다
Optional은 null 값이 올 수도 있는 값을 감싸는 Wrapper 클래스로
참조하더라도 NullPointerExeption이 발생하지 않도록 도와준다
자바 공식 문서에는 다음과 같이 Optional을 만든 의도가 적혀있다
메소드가 반환할 결과 값이 '없음'을 명백하게 표현할 필요가 있고
null을 반환하면 에러가 발생할 가능성이 높은 상황에서
메소드 반환 타입으로 Optional을 사용하자는 것이 Optional을 만든 주된 목적이다
Optional 타입의 변수 값은 절대 null이어서는 안되며, 항상 Optional 인스턴스를 가리켜야 한다
public final class Optional<T> {
// If non-null, the value; if null, indicates no value is present
private final T value;
...
}
다음과 같이 Optional 클래스는 value에 값을 저장하기 때문에
값이 null이라도 바로 NullPointerExeption이 발생하지 않으며, 클래스이기 때문에 각종 메소드를 제공한다
Optional 메소드
Optional의 대표적으로 사용하는 메소드를 알아보도록 하자
Optional.empty()
값이 Null인 경우
Optional은 Wrapper 클래스이기 때문에 값이 없을 수도 있는데, 이 때는 Optional.empty()로 생성할 수 있다
아무런 값도 가지지 않는 비어있는 Optional 객체를 반환한다
Optional 클래스는 내부에서 static 변수로 EMPTY 객체를 미리 생성해서 가지고 있다
이러한 이유로 빈 객체를 여러번 생성해야 하는 경우에도
한 개의 EMPTY 객체를 공유함으로써 메모리를 절약한다
public final class Optional<T> {
private static final Optional<?> EMPTY = new Optional<>();
private final T value;
private Optional() {
this.value = null;
}
...
}
Optional.of()
값이 Null이 아닌 경우
절대 null일 수 없는 데이터는 Optional.of()로 생성한다
만약 Optional.of()로 Null을 저장하려고 하면 NullPointerExeption이 발생한다
// Optional.of의 value는 절대 null이 아니다.
Optional<String> optional = Optional.of("Name");
Optional.ofNullable()
값이 Null일수도, 아닐수도 있는 경우
어떤 데이터가 null일수도 있고, null이 아닐 수도 있는 경우에는 Optional.ofNullable()로 생성한다
생성 후에 orElse 또는 orElseGet 메소드를 이용해서 값이 없는 경우라도 안전하게 값을 가져올 수 있다
// Optional의 value는 값이 있을 수도 있고 null 일 수도 있다.
Optional<String> optional = Optional.ofNullable(getName());
// 값이 없다면 "anonymous" 를 리턴
String name = optional.orElse("anonymous");
참고자료
- 망나니개발자
- coco3o
- 태빵.log
'Language > Java' 카테고리의 다른 글
[Java] 객체 지향 프로그래밍 - 상속 (0) | 2024.04.03 |
---|---|
[Java] JsonArry 형태의 문자열을 List<VO>객체로 변환하기 (0) | 2023.10.12 |
[JAVA] 자바11 설치 / 환경변수 설정 (Window11) (2) | 2023.07.31 |
[JAVA] 입출력 스트림(자바I/O 스트림) (0) | 2022.02.13 |
[JAVA] throws 키워드 : 예외 떠넘기기 (0) | 2022.02.13 |