[Java] Objects.requireNonNull과 Optional

이멀젼씨

·

2021. 6. 9. 14:52

목적

Objects.requireNonNull과 Optional의 동작이 유사한 것 같아, 정확하게 무엇이 어떻게 다른지 파악하기 위함

목차

  1. Objects.requireNonNull이란?
  2. Optional이란?
  3. Objects.requireNonNull과 Optional의 차이점

1. Objects.requireNonNull이란?

Checks that the specified object reference is notnulland throws a customized[NullPointerException] if it is. 
This method is designed primarily for doing parameter validation in methods and constructors with multiple parameters, as demonstrated below:
  public Foo(Bar bar, Baz baz) {

    this.bar = Objects.requireNonNull(bar, "bar must not be null");  
    this.baz = Objects.requireNonNull(baz, "baz must not be null");

  }

특정한 객체 참조가 널인지 판단하고, null인 경우 사용자 지정 NullPointException을 발생시킨다. 이 메소드는 주로 메서드나 생성자의 매개변수 유효성 검증을 위해 설계 되었다.

API문서에 나온 그대로 메소드나 생성자의 파라미터 null 검증을 위해 설계된 메서드이다.

requireNonNull 메서드

동작원리는 아무 타입의 매개변수를 받아 해당 매개변수가 null이면 NPE를 발생시키고,

그렇지 않으면 매개변수를 그대로 반환한다.

매개변수가 하나 더 있는 경우엔 NPE가 발생할 경우 뒤의 매개변수를 NPE의 메시지로 출력해준다.

public class Java {

    private Integer count;

    public Java(){

    }

    public Java(Integer i){
        this.count = Objects.requireNonNull(i);
    }
}

일반적으로 위와같이 사용하며, 굉장히 직관적인걸 볼 수 있다.

장점으로는

  • Fail-Fast(가능한한 빠르게 실패하고, 문제를 파악할 수 있다.)
  • 반환값으로 받은 객체에 대해선 null-safe하게 사용할 수 있다.

등이 있다.


2. Optional이란?

A container object which may or may not contain a non-null value. 
If a value is present,isPresent()will returntrueandget()will return the value.

null이 아닌 값을 포함하거나 포함하지 않을 수 있는 컨테이너 객체이다.
값이 존재하면, isPresent()가 true를리턴하고 get()은 값을 리턴한다.

오라클의 공식 기사에 따르면 코드를 더 읽기 쉽게 만들고 널 포인터 예외로부터 보호하기 위하여 사용한다고 한다.

Optional 미사용
Optional 사용

Optional을 사용하지 않는 경우엔 각각 null을 체크하며 null인 경우와 아닌 경우를 나누어 줬는데,

Optional을 사용하여 null의 여부와는 상관없이 동일한 로직을 타게 만들었다.

가독성이 굉장히 좋아진걸 볼 수 있으며, NPE로부터 어느정도 자유로워졌다.


3. Objects.requireNonNull과 Optional의 차이점

둘 다 NPE를 피하기 위한 방법이지만 사용법이 다르다.

Objects.requireNonNull의 경우 결과값이 절대로 null이 되어서는 안된다는 것을 보장한다.

하지만 Optional의 경우 null을 반환하면 NPE가 발생할 가능성이 높은 경우 이를 안전하게 처리하기 위해 사용한다.

각자 사용법이 다르며 생성자나 메소드에서 절대 null이 되면 안되는 매개변수에는 Objects.requireNonNull을

프로그램 내에서 객체가 null일 가능성이 있을때 NPE를 막기 위해선 Optional을 사용하면 되겠다.

'백엔드 > Java' 카테고리의 다른 글

[Java] Generics  (0) 2021.07.30