Java 7, null check 하기

Java 7에서 추가된 ObjectsrequireNonNull(T t) 메서드는 파라미터의 null 체크를 위한 메서드로 null을 어떻게든 해보려는 목적에서 Java 8의 Optional과 비슷한 면이 있지만 그 처리는 상당한 차이가 있다. 이번 post에선 requireNonNull에 대해 다룬다.

메서드에서 null일 가능성이 있는 인자가 있을 때, 이를 메서드 시작 지점에서 체크하여 Exception을 던지고자 하는 경우 다음과 비슷한 코드를 종종 볼 수 있다.

1
2
3
4
5
6
public void nullableParameterMethod (Object object) throws NullPointerException {
if ( null == object ) {
throw new NullPointerException();
}
System.out.println(String.valueOf(object));
}

잘 동작할 것처럼 보이는데 이것에서 더 개선할 점이 있을까? Objects.requireNonNull은 이 코드를 더 편하게 사용하는 것을 목표로 한다.

1
2
3
4
public void nullableParameterMethod2 (Object object) {
object = Objects.requireNonNull(object);
System.out.println(String.valueOf(object));
}

Objects.requireNonNull(T t)은 인자 t가 null이 아니면 인자 t를 리턴하고 null이라면 내부에서 NullPointerException을 호출하는 메서드다. 이 정도로는 뭐가 개선된 건지 알기 어렵다. 코드가 아주 약간 줄어들기는 했지만 그게 그렇게 중요할까? 물론 의미는 있다. 메서드를 이해하고 있다면 가독성의 증가라고 생각해볼 수 있을 것이다. 그리 썩 대단해보이지는 않지만 null 체크만이 아니라 다양한 상태 체크가 있다면 좀 도움이 되지 않을까?

같은 이름의 Objects.requireNonNull(T t, String message) 메서드는 예외 상황에 대해 메시지를 추가해준다.

1
2
3
4
public void nullableParameterMethod3 (Object object) {
object = Objects.requireNonNull(object, "object가 null입니다.");
System.out.println(String.valueOf(object));
}

여기까지도 뭐 그냥저냥인 것 같다. 그런데 Java 8에 오면서 lambda 식이 생김으로서 하나의 메서드가 더 생겼다. Objects.requireNonNull(T t, Supplier<String> messageSupplier)다.

1
2
3
4
public void nullableParameterMethod4 (Object object) {
object = Objects.requireNonNull(object, () -> "object가 null입니다.");
System.out.println(String.valueOf(object));
}

Supplier<T>는 無인자 單 리턴의 Functional Interface로서 매우 Lazy 하고 싶을 때 쓰기 좋다. return이 String이기만 하다면 그 안에서 여러가지를 할 수 있으므로 검사 대상인 객체가 null일 때 Exception을 던지는 것 말고도 여러가지 작업을 추가할 수 있을 것이다. 그런데 여전히 if (null == object) {...}에 비해 아주 대단해 보이지는 않는다. 좀 나은 정도? 불필요한 코드 라인 수를 줄이는데 도움이 될 것이다.

다음 post에서는 Optional<T>에 대해 알아볼 것이다.