Java

[Java] Optional<T> 클래스

2023. 5. 3. 23:52
목차
  1. Optional
  2. Optional 이란?
  3. Optional 객체 생성
  4. 1) ofNullable()
  5. 2) of()
  6. 3) Optional.empty()
  7. 4) 생성 예제
  8. Methods
  9. 1) get()
  10. 2) isPresent()
  11. 3) isEmpty()
  12. 4) orElse()
  13. 5) orElseThrow()

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);
  1. Optional [hello] 출력
  2. Optional.empty 출력
  3. Optional.empty 출력
  4. 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' 카테고리의 다른 글

[JAVA] 생성자 / 오버로딩(overloading)  (0) 2023.05.17
[Java] StringTokenizer  (0) 2023.05.04
[Java] String 클래스, 관련 메소드  (0) 2023.04.20
[JAVA] Object 클래스_toString() 메서드  (0) 2023.02.05
[JAVA] 인터페이스(interface)  (0) 2023.02.03
  1. Optional
  2. Optional 이란?
  3. Optional 객체 생성
  4. 1) ofNullable()
  5. 2) of()
  6. 3) Optional.empty()
  7. 4) 생성 예제
  8. Methods
  9. 1) get()
  10. 2) isPresent()
  11. 3) isEmpty()
  12. 4) orElse()
  13. 5) orElseThrow()
'Java' 카테고리의 다른 글
  • [JAVA] 생성자 / 오버로딩(overloading)
  • [Java] StringTokenizer
  • [Java] String 클래스, 관련 메소드
  • [JAVA] Object 클래스_toString() 메서드
HSRyuuu
HSRyuuu
Web Backend Developer happyhsryu
HSRyuuu
HS_dev_log
HSRyuuu
전체
오늘
어제
  • 전체 글 보기 (235)
    • Java (25)
    • Spring (29)
    • JPA & QueryDSL (13)
    • Database (17)
    • 자료구조 & 알고리즘 (30)
    • DevOps (10)
    • [ Computer Science ] (47)
      • Web & Network (14)
      • 프로그래밍 이론 (11)
      • 운영체제 (3)
      • 데이터베이스 이론 (5)
      • Linux 리눅스 (7)
    • [ Frontend ] (17)
      • Vue.js & Nuxt.js (9)
      • JSP_Thymeleaf (7)
    • [ 기타 ] (47)
      • 오픈소스 라이브러리 (5)
      • 코딩테스트 (13)
      • Trouble Shooting (7)
      • Tech Interview (6)
      • Book Review (9)
      • 끄적끄적... (5)
      • 개인 프로젝트 (2)

블로그 메뉴

  • 홈
  • 태그
  • github

공지사항

  • GitHub
  • 공부한 내용을 정리하고 기록하는 블로그 입니다.

인기 글

태그

  • Spring
  • HTTP
  • 백준
  • Linux
  • 개발자
  • Redisson
  • mybatis
  • web
  • vue3
  • TechInterview
  • 백엔드기술면접
  • springsecurity
  • MySQL
  • 백엔드스쿨
  • 트랜잭션
  • JPA
  • SQL
  • 기술면접
  • Nuxt3
  • 백엔드공부
  • Database
  • Redis
  • 백엔드
  • 자료구조
  • 클린코드
  • SpringBoot
  • cleancode
  • 제로베이스
  • Java
  • 리눅스

최근 댓글

최근 글

hELLO · Designed By 정상우.
HSRyuuu
[Java] Optional<T> 클래스
상단으로

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.