[자바] Null 체크 (1) (feat. Optional 적용)

손경이·2023년 11월 7일
0

자바

목록 보기
13/17

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

Null 체크(feat. Optional 적용)

  • 실무에서는 Null 체크 지옥이 자주 발생한다.
  • Null 을 직접 다뤄도 되고, Optional 방식으로 다뤄도 된다.
  • 자바에서는 어떤 객체가 null일 수도 있고 아닐 수도 있다고 할 때 Optional<객체 클래스>을 쓰라고 권유한다. 꼭 이렇게 해야하는 건 아니다.

지금 기억해야할 거
Optional에는 여러가지 장치가 있다.

Optional에는 여러가지 장치

  • 외우자. Optional로 만들어 놓으면 여러가지 장치들이 있어서 코드량을 줄 일 수 있다.
  • Optional을 잘 모르겠다면 쓰지 마라. 가끔가다 보이면 이런거구나 생각하자.

Optional 여러가지 장치 적용

package com.ll.date20231107;

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

public class NullCheck {
    public static void main(String[] args) {
        /*
        PersonNull person = new PersonNull();
        // Optional 들어오기 전 세상, 코드를 믿을 수 없다.
        // 개발을 하다보면 null이 나올 때가 있다.
        // grab() 호출까지 person,leftArm,hand가 null이 아닌지 체크해야 한다.
        // 실무코드에 이런게 많다. 왜냐하면 널에다 일 시키면 오류가 나서.
        if (person != null)
            if (person.leftArm != null) {
                if (person.leftArm.hand != null) {
                    person.leftArm.hand.grab(); // 왼팔에 달린 왼손으로 잡기
                }
        }
         */

        Optional<PersonNull> personOp = Optional.ofNullable(new PersonNull());

        // 지금 기억해야할 거
        //Optional에는 여러가지 장치가 있다.
        PersonNull person1 = personOp.get(); // get()은 데이터가 없으면 뻗어버린다.
        PersonNull person2 = personOp.orElse(null);
        // orElse(null); 는 데이터가 없으면 오류를 내뿜는 대신에 null을 준다.

        // Optional 쓰다보면 자연스럽게 익혀질거다.
        // getLeftArm, getHand, grab 다 Optional이면 flatMap()을 이어서 stream처럼 쓸 수 있다.
        personOp
                .flatMap(PersonNull::getLeftArm)
                .flatMap(Arm::getHand)
                .ifPresent(Hand::grab);
        // Person클래스에 팔이 있고 Arm클래스에 손이 있다면 이 hand가 존재한다면
        // Hand클래스 안에 있는 grab을 실행시켜라. 라는 뜻이다.

        // 외우자. Optional로 만들어 놓으면 여러가지 장치들이 있어서
        // 코드량을 줄 일 수 있다.
        // Optional을 잘 모르겠다면 쓰지 마라. 가끔가다 보이면 이런거구나 생각하자.
    }
}

class PersonNull {
    private Optional<Arm> leftArm;
    private Optional<Arm> rightArm;

    public PersonNull() {
//        this.leftArm = new Arm(); // 왼팔
//        this.rightArm = new Arm(); // 오른팔

        // Optional로 감싸고 값을 넣을 때 ofNullable() 사용
        // Optional.of는 잊고 무조건 ofNullable로 써라
        this.leftArm = Optional.ofNullable(new Arm()); // 옵셔널 안에 만든거다.
        this.rightArm = Optional.ofNullable(new Arm());
    }

    public Optional<Arm> getLeftArm() {
        return leftArm;
    }

    public void setLeftArm(Optional<Arm> leftArm) {
        this.leftArm = leftArm;
    }

    public Optional<Arm> getRightArm() {
        return rightArm;
    }

    public void setRightArm(Optional<Arm> rightArm) {
        this.rightArm = rightArm;
    }
}

class Arm {
    private Optional<Hand> hand; // 손
    private Optional<Shoulder> shoulder; // 어깨

    public Arm() {
//        this.shoulder = new Shoulder();
//        this.hand = new Hand();

        this.shoulder = Optional.ofNullable(new Shoulder());
        this.hand = Optional.ofNullable(new Hand());
    }

    public Optional<Hand> getHand() {
        return hand;
    }

    public void setHand(Optional<Hand> hand) {
        this.hand = hand;
    }

    public Optional<Shoulder> getShoulder() {
        return shoulder;
    }

    public void setShoulder(Optional<Shoulder> shoulder) {
        this.shoulder = shoulder;
    }
}

class Shoulder {

}

class Hand {
    // 손의 집는 기능
    public void grab() {
        System.out.println("Grabbing");
    }
}

0개의 댓글