Null Object 패턴은 자바를 비롯한 객체지향 프로그래밍에서 null 참조로 인해 발생할 수 있는 문제(예: NullPointerException)를 방지하기 위해 사용되는 디자인 패턴입니다.
이 패턴은 전략 패턴이나 상태 패턴과 유사하게 “아무것도 하지 않는” 구체적인 행동을 제공함으로써 클라이언트가 내부 구현에 신경쓰지 않고 일관된 인터페이스를 사용할 수 있게 합니다.
아래는 고객(Customer)을 처리하는 상황에서 실제 고객과 Null 고객을 구분하여 사용하는 예제입니다.
import java.util.Date;
// 고객 인터페이스 정의
public interface Customer {
void pay();
boolean isTimeToPay(Date payDate);
}
// 실제 고객 구현: 정상적인 로직 수행
public class RealCustomer implements Customer {
@Override
public void pay() {
System.out.println("고객 지불 처리 중...");
}
@Override
public boolean isTimeToPay(Date payDate) {
// 실제 결제 시간이 되었는지 판단하는 로직
return true; // 예시로 항상 true 반환
}
}
// Null 고객 구현: 아무 동작도 하지 않음 (싱글톤으로 구현 가능)
public class NullCustomer implements Customer {
private static final NullCustomer instance = new NullCustomer();
private NullCustomer() { }
public static NullCustomer getInstance() {
return instance;
}
@Override
public void pay() {
// 아무런 동작도 하지 않음
}
@Override
public boolean isTimeToPay(Date payDate) {
return false;
}
}
이제 데이터베이스 등에서 고객을 찾을 때, 고객이 존재하지 않는 경우에 null 대신 NullCustomer.getInstance()를 반환하도록 하면, 클라이언트 코드에서는 별도의 null 체크 없이 다음과 같이 메서드를 호출할 수 있습니다.
public class PaymentProcessor {
public void processPayment(String customerName, Date today) {
// DB에서 고객을 조회하는 메서드가 고객이 없을 경우 NullCustomer를 반환하도록 구현했다고 가정
Customer customer = DB.getCustomer(customerName);
// null 체크 없이 바로 메서드 호출 가능!
if (customer.isTimeToPay(today)) {
customer.pay();
}
}
}
장점:
단점:
Null Object 패턴은 자바에서 null 체크로 인한 불필요한 복잡성과 오류를 줄이기 위해 매우 유용한 패턴입니다. 객체가 없을 때도 인터페이스의 일관성을 유지함으로써, 클라이언트 코드가 간결해지고 유지보수가 쉬워집니다. 다만, 이 패턴을 도입할 때는 실제로 예외가 발생해야 하는 경우를 놓치지 않도록 주의하는 것이 중요합니다.