널 오브젝트 패턴

객체가 존재하지 않을 때 null을 전달하는 대신, 아무 일도 하지 않는 객체를 대신 전달해 반복적인 null 체크 코드를 없애는 디자인 패턴입니다.

기존 문제

public void doSomething(MyObject obj) {
    if (obj == null) {
        throw new Exception();
    }

    obj.doMethod();
}

이런 형태의 null 체크가 여러 곳에서 반복되면 코드가 복잡해지고 실수로 체크를 누락하기도 쉽습니다.

적용 방법

null을 다루는 대신, 인터페이스를 구현하되 아무 동작도 하지 않는 객체를 만들어 사용합니다.

class MyNullObject implements MyObject {

    @Override
    public void doMethod() {
        // 아무것도 하지 않음
    }
}

class MyRealObject implements MyObject {

    @Override
    public void doMethod() {
        System.out.println("무엇인가 수행합니다.");
    }
}

public void doSomething(MyObject obj) {
    obj.doMethod();
}

호출부에서 null 여부를 분기할 필요 없이 항상 doMethod()를 호출하면 됩니다.

적용 범위

null인 경우에만 쓰이는 것은 아니고, 특별한 케이스 전반에 응용할 수 있습니다. 예를 들어 스택 자료구조에서 용량이 0인 경우를 표현하는 ZeroCapacityStack처럼, 예외적인 상황을 별도의 구현체로 분리하는 데도 사용됩니다.

장점

주의사항

핵심 정리

널 오브젝트 패턴은 null 대신 아무 동작도 하지 않는 객체를 사용해 null 체크 코드를 없애는 패턴입니다. 반복적인 방어 코드를 줄이는 데는 유용하지만, 예외 상황을 은폐할 수 있다는 점을 고려해서 적용해야 합니다.

→ 널 오브젝트 패턴이란 무엇인가요?

CSLOG에서 보기