728x90
1. 개념
널 오브젝트 패턴은 null을 반환하거나 사용하지 않고, 그 대신에 행동은 하지만 아무 효과가 없는 객체를 반환하거나 사용하는 방식이다. 이 객체는 실제 구현체와 동일한 인터페이스를 구현하지만, 내부 로직은 아무것도 하지 않는다.
728x90
2. 구성요소
- 인터페이스 or 추상 클래스
> 공통된 메서드 정의
- 실제 구현 클래스(Real Object)
> 기능을 실제로 수행
- 널 오브젝트 클래스(Null Object)
> 아무것도 하지 않는 구현체 (혹은 디폴트 동작만 수행)
예제)
public interface Log {
void info(String message);
}
// 실제 로깅 구현
public class ConsoleLog implements Log {
public void info(String message) {
System.out.println("INFO: " + message);
}
}
// Null Object 구현
public class NullLog implements Log {
public void info(String message) {
// 아무것도 하지 않음
}
}
// 사용 예
public class App {
private final Log log;
public App(Log log) {
this.log = log;
}
public void run() {
log.info("앱이 실행됨");
}
}
// 메인
public class Main {
public static void main(String[] args) {
Log log = new NullLog(); // 로깅 비활성화
App app = new App(log);
app.run(); // 아무 출력도 없음
}
}
3. 장점
null 체크 불필요 → 코드 간결해짐
런타임 NullPointerException 방지
전략 패턴처럼 사용 가능 (행동을 바꾸는 객체를 주입)
4. 단점
의도적으로 아무 일도 하지 않는 객체가 동작하기 때문에, 디버깅 시 문제가 감춰질 수 있음
잘못 사용하면 버그를 놓칠 위험 있음
5. 언제 쓰면 좋을까?
선택적으로 기능(예: 로깅, 알림 등)을 끄거나 대체할 때
컬렉션에서 null 대신 의미 있는 기본 객체를 사용할 때
객체의 존재 여부를 판단하지 않고 동일한 흐름을 유지하고 싶을 때
728x90
'개발 > Java & Kotlin' 카테고리의 다른 글
[JPA] JPA에서 양방향 @OneToOne 관계와 Lazy Loading의 한계 (95) | 2025.04.06 |
---|---|
[Spring] 의존성 주입 간단히 알아보자 (94) | 2025.03.31 |
[Spring] 스프링 트랜잭션 전파 속성 (39) | 2025.03.29 |
[Spring] CQRS 패턴이란? (98) | 2025.03.23 |
[Spring] 스프링 트랜잭션 AOP 동작 흐름 (44) | 2025.03.21 |