[자바] Optional (feat. List 비교)

손경이·2023년 11월 7일
0

자바

목록 보기
12/17

2023.11.07 [테킷 백엔드 장희성 강사님 강의]

Optional

List와 비교

  • 공통점
    • List도 박스고 Optional도 박스이다.
    • 둘 다 객체 리모콘(주소)를 가지고 있을수도 있다.
  • Optional
    • 박스 안에 내용이 있을 수도 있고 없을수도 있다.
    • Optional은 0~1개가 있다.
    • 없는 상태에서 .get() 하면 NoSuchElementException 발생한다. 그리고
      get()에 숫자 필요없다.
    • 데이터가 있으면 오류가 안나고 데이터가 없으면 오류가 난다.
  • List
    • 박스인데 칸이 여러개 들어있다.
    • List는 인덱스가 아예 없을 수 있다. 또는 1개 있을 수 있고 여러개 있을 수 있따.
    • List의 경우 값이 없는 인덱스를 찍으면 IndexOutOfBoundsException 발생한다.
    • 데이터 가져올 때 .get(0) 숫자를 넣어준다.

정리

  • List는 데이터가 많을 수 있고 없을 수도 있고
    Optional은 데이터가 1개 있을 수도 있고 없을 수 있는 거 빼고는 아무런 차이도 없다.
  • List는 객체를 감싸고 있다. 그리고 다른 객체들 리모콘이 있을 수 있고 없을 수 있다.
    Optional도 똑같은데 딱 하나를 감싼다.
    하나의 껍데기로 감쌌는지 안 감쌌는지 차이다.

Optional 사용

package com.ll.date20231107;

import java.util.ArrayList;
import java.util.List;
import java.util.NoSuchElementException;
import java.util.Optional;

public class Optional_Study {
    public static void main(String[] args) {
        PersonOp person1 = new PersonOp(1, "bob");

        // List의 개수 : 0 ~ N 개
        List<PersonOp> personList = new ArrayList<>() { // 익명클래스
            { // 생성자 / 사람person1은 한명이지만 사람 리모콘은 3개이다.
                add(person1); // this. 생략
//                add(person1);
//                add(person1);
            }
        };
        // 리스트 데이터 가져오기
        // 데이터 가져올 때 숫자 필요
        PersonOp personOfIndex0 = personList.get(0);
        try {
            PersonOp personOfIndex1 = personList.get(1);
        } catch (IndexOutOfBoundsException ignored) {
        }

        // Optional의 개수  : 0 ~ 1 개, 1개 이상이 나올 수 없다.
        Optional<PersonOp> personOp = Optional.of(person1);
        // Optional 데이터 가져오기
        // 데이터 가져올 때 숫자 필요 없음
        PersonOp personOfOptional = personOp.get();

        // 데이터의 개수가 0개인 옵셔널 객체 생성
        // ofNullable() : null을 확실하게 넣을 때 사용
        Optional<PersonOp> personOp2 = Optional.ofNullable(null);
//        personOp2.get(); // 데이터가 없기 때문에 get()하면 안된다.
        try {
            personOp2.get();
        } catch (NoSuchElementException ignored) {
        }
    }
}

class PersonOp {
    private int id;
    private String name;

    public PersonOp(int id, String name) {
        this.id = id;
        this.name = name;
    }
}

0개의 댓글