본문 바로가기
혼자 공부하는 것들/JAVA

Objects.requireNonNull은 왜 사용할까?

by applepick 2023. 6. 1.
반응형

https://github.com/pinpoint-apm/pinpoint

 

GitHub - pinpoint-apm/pinpoint: APM, (Application Performance Management) tool for large-scale distributed systems.

APM, (Application Performance Management) tool for large-scale distributed systems. - GitHub - pinpoint-apm/pinpoint: APM, (Application Performance Management) tool for large-scale distributed sys...

github.com

오픈소스인 pinpoint의 코드를 분석하던 중 중간중간 Objects.requireNonNull으로 null 여부를 처리하는 부분을 볼 수 있었다.

이펙티브 자바를 읽다가 나왔던 부분이기도하다. 왜 이렇게 처리했을까?

 

1) 빠른실패(Fail-Fast)

    public String selectA(String text){
        //로직1
        selectB(text);
    }

    public String selectB(String text){
        //로직2
        selectC(text);
    }
    
    public String selectC(String text){
        //로직3
        System.out.println(text);
    }

 

위와 같은 코드가 있다고 가정해 보자.

selectA -> selectB -> selectC로 호출하고 있다. 이때 selectA에서 null을 넘겨준다면?

selectC에 도달해야 해당 NPE이 발생하는 것을 볼 수 있다.

    public String selectA(String text){
        //로직1
        selectB(Objects.requireNonNull(text));
    }

    public String selectB(String text){
        //로직2
        selectC(text);
    }
    
    public String selectC(String text){
        //로직3
        System.out.println(text);
    }

위와 같이 변경한다면 selectC까지 호출하기 전 selectA에서 NPE가 발생하는 것을 볼 수 있다. 이처럼 Objects.requireNonNull을 사용하면 실패지점을 빠르게 파악할 수 있다.

 

2) 명시적인 예외 처리 && 가독성 유지 보수성

Objects.requireNonNull 사용하면 값이 발견되면 명시적으로 NullPointerException을 발생시킨다. 이를 통해 값으로 인한 문제를 신속하게 파악하고 디버깅이 가능하다. Null Check는 일반적으로 많은 코드에서 반복적으로 수행되어야 하는 작업이다.

public void process(String data) {
    Objects.requireNonNull(data, "data parameter must not be null");
    // data를 처리하는 코드 작성
}

public void process(String data) {
    if(data == null) {
    	throw new NullPointerException("data parameter must not be null");
    }
    // data를 처리하는 코드 작성
}

위 두 코드 중 첫 번째가 가독성이 더 좋아 보인다. 이렇게 Objects.requireNonNull 사용하면 Null Check 간단하고 명확하게 표현할 있으며, 코드의 의도를 명확하게 전달할 수 있다

 

끝!

반응형

댓글