[디자인 패턴] Null Object Pattern

벼랑 끝 코딩·2025년 3월 16일

Design Pattern

목록 보기
3/6

Null은 굉장히 조심해야할 요소 중 하나이다.
있어야 할 자리에 없는 것도 문제이고,
없는 것을 있는 것처럼 취급하는 것도 문제이다.

이러나 저러나 신경쓰게 만드는 것이 바로 Null이라는 존재인데,
Null을 좀 더 유연하게 사용할 수 있는 Null Object Pattern에 대해 알아보자.

Null Object Pattern 도입 전

Null을 다루는 것은 굉장히 위험한 순간이다.
Null을 다룸으로써 예외가 발생하여 예기치 못한 상황에 봉착할 수 있기 때문이다.

이 상황을 타개하는 방법은 간단하다. Null을 다루지 않으면 된다.

... Null이 내 수중에 있는데 어떻게 Null을 다루지 않을 수 있는가?
Null 대신 Null이라고 표시한 나만의 객체를 만들면,
Null과 관련된 예외가 발생하지 않으면서 Null을 취급할 수 있다!

Null Object Pattern

Null Object Pattern은 Null 대신 이용할 수 있는 객체를 만드는 것을 의미한다.
핵심은 Null 대신 다른 객체를 생성하여 Null 예외 상황을 만들지 않는 것이다.

interface Animal {
	public String sound();
}

class Dog implements Animal {
	
    @Override
    public String sound() {
    	return "멍멍";
    }
}

class Cat implements Animal {
	
    @Override
    public String sound() {
    	return "야옹";
    }
}

동물 소리를 내는 클래스가 있다.
강아지나 고양이에 관련된 정보를 입력받았을 때 Dog, Cat 객체가 생성된다고 하면,
sound() 메서드를 호출하면 멍멍과 야옹 소리를 들을 수 있을 것이다.

하지만 클래스로 정의되지 않은 호랑이나 새의 정보를 입력받으면 어떻게 될까?
Tiger, Bird 클래스는 정의되지 않았기 때문에 아무런 객체도 생성되지 않고
생성되지 않은 객체의 메서드를 호출하려고 하면 Null 예외가 발생할 것이다!

class NullAnimal implements Animal {
	
    @Override
    public String sound() {
    	return "없음";
    }
}

하지만 NullAnimal이라는 Object를 추가해보자.
이제 정의되지 않은 동물에 대한 정보를 입력받으면 아무런 객체가 생성되지 않는 대신,
NullAnimal 객체가 생성된다.
이후 sound() 메서드를 호출하면 "없음"이라는 문자열을 확인할 수 있다.

아무것도 생성되지 않아 Null 예외의 위협을 받는 대신,
Null을 대신할 객체를 생성해서 상황에 적절하게 대응할 수 있게 됐다!
이제 Null 예외를 체크할 필요도 없어져서 더욱 클린한 코드를 만들 수 있다.

마무리

내가 설계하고 내가 호출하는 내설내호(아무말) 상황에서는
Null 예외를 적절히 피해가고 제어할 수도 있다.

하지만 특히 사용자의 입력을 받는 상황에서는 예기치 못한 Null 상황에 빠질 수 있다.
Null을 예외를 의식해서 Null 체크 코드가 너무 많은건 아닌지 의식해보자.
Null을 대신할 객체를 생성한다면 더욱 아름다운 코드를 만들 수 있다.

profile
복습에 대한 비판과 지적을 부탁드립니다

0개의 댓글