[Java] Optional이란?

2023. 9. 4. 15:24·Language/Java

개발을 할 때 가장 많이 발생하는 예외 중 하나가 바로 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)  (3) 2023.07.31
[JAVA] 입출력 스트림(자바I/O 스트림)  (0) 2022.02.13
[JAVA] throws 키워드 : 예외 떠넘기기  (0) 2022.02.13
'Language/Java' 카테고리의 다른 글
  • [Java] 객체 지향 프로그래밍 - 상속
  • [Java] JsonArry 형태의 문자열을 List<VO>객체로 변환하기
  • [JAVA] 자바11 설치 / 환경변수 설정 (Window11)
  • [JAVA] 입출력 스트림(자바I/O 스트림)
soyeon26
soyeon26
  • soyeon26
    개발 일지
    soyeon26
  • 전체
    오늘
    어제
    • 분류 전체보기 (107)
      • Web (22)
        • Web (1)
        • HTTP (0)
      • Language (29)
        • Java Script (3)
        • Type Srcipt (1)
        • Java (25)
      • Front (19)
        • HTML+CSS (4)
        • React (15)
      • Back (41)
        • Spring(Springboot) (9)
        • JSP (21)
        • Database (5)
        • NestJS (6)
      • Devops (6)
        • Docker (1)
        • Git & SVN (5)
      • App (7)
        • Android (7)
      • IT 정보 (3)
  • 블로그 메뉴

    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    프론트엔드
    자바스크립트set
    과학기술인등록번호 조회
    강의후기
    java의 정석
    과학기술인번호 조회
    Next.js 필요성
    백엔드
    데이터베이스 강의
    Java
    중복제거
    Spring
    과학기술인 번호 발급
    Next.js
    SQL강의 추천
    sql강의
    javascript
    React
    서블릿
    springboot
    스프링부트
    React Next.js
    csr과ssr의 차이
    김영한
    과학기술인 등록번호 발급
    SSR
    과학기술인 등록
    csrvsssr
    강의 후기
    인프런
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
soyeon26
[Java] Optional이란?
상단으로

티스토리툴바