널 오브젝트 패턴
객체가 존재하지 않을 때 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을 명시적으로 다루지 않기 때문에, 원래라면 예외 상황으로 감지해야 할 경우를 조용히 넘겨버릴 수 있습니다.
- 디버깅 시 문제를 발견하기 어려워질 수 있어, null이 실제로 오류를 의미하는 상황인지 구분해서 적용해야 합니다.
핵심 정리
널 오브젝트 패턴은 null 대신 아무 동작도 하지 않는 객체를 사용해 null 체크 코드를 없애는 패턴입니다. 반복적인 방어 코드를 줄이는 데는 유용하지만, 예외 상황을 은폐할 수 있다는 점을 고려해서 적용해야 합니다.