본문 바로가기

유니티/디자인 패턴

[Unity] 널 객체 패턴 (Null Object Pattern)

반응형

널 객체 패턴(널 오브젝트 패턴)이란?

이 디자인 패턴은 어떤 클래스를 참조할 때 "비어있다"에 대한 정보를 null이 아닌 정보가 없는 객체로 나타내는 기법이다.

다시 말해, 객체로 null을 나타낸다.


왜 사용하는 것일까?

이는 null의 문제점을 생각하면 쉽게 이유를 찾을 수 있다.

어떠한 참조값을 사용하려고 할때는 해당 값이 null이 아님을 보장해야 한다. 따라서 우리는 코드로 해당값이 null이 아니도록 장치를 해두거나, 사용할 때마다 null체크를 해야 한다. 그렇지 않으면 null exception에러를 보게 될 수도 있다.

 

널 오브젝트 패턴은 이러한 문제를 해결하기 위해 사용한다. null에 해당하는 기본값 클래스를 만들어서 null 대신에 사용한다. 아래의 예제는 널 오브젝트 패턴을 일부 구현한 과정이다.


어떻게 사용할까?

기본 구조는 하나의 인터페이스(혹은 추상클래스)와 하나 이상의 구체 클래스, 그리고 이를 참조하는 클래스로 이루어진다.

 

예를 들어, 캐릭터가 여러개의 무기를 번갈아서 착용한다고 하자.

이때 무기가 없는 상황일 경우에 null을 사용해야 할까? 널 오브젝트 패턴에서는 null 대신에 실행부가 없는 빈 클래스를 사용한다.

 

이제 스크립트를 하나씩 나열하면 다음과 같다.

public class Character : MonoBehaviour
{
    public int hp = 100;
    public int damage = 20;
    public float attackSpeed = 5;
    public int criticalRate = 20;
    public int criticalDamage = 50;

    public void Attck()
    {
        //Do Something
    }

    public void ChangeWeapon(IWeapon weapon)
    {
        UnEquip();
        weapon.Equip(this);
    }

    private void UnEquip()
    {
        hp = 100;
        damage = 20;
        attackSpeed = 5;
        criticalRate = 20;
        criticalDamage = 50;
    }
}

위 캐릭터 클래스는 필드 멤버의 변화를 나타내기위한 데이터 클래스이며, 이 예제에서는 ChangeWeapon(IWeapon)을 사용하는 것이 목적이다.

 

아래는 무기를 장착했을때 실행할 수 있는 함수를 담고 있는 인터페이스이다. 이 인터페이스를 활용하여 여러 개의 구체클래스(널 객체 포함)를 생성한다.

public interface IWeapon
{
   void Equip(Character character);
}

 

마지막으로 이 인터페이스로 생성된 여러개의 구체 클래스이다.

public class Sword : IWeapon
{
    public void Equip(Character character)
    {
        character.damage += 5;
        character.criticalDamage *= 2;
        character.criticalRate += 10;
    }
}

public class Hand : IWeapon
{
    public void Equip(Character character)
    {

    }
}

public class Bow : IWeapon
{
    public void Equip(Character character)
    {
        character.damage += 4;
        character.criticalDamage *= 3;
        character.criticalRate += 5;
    }
}

이때 Hand 클래스처럼 null일 경우에 사용할 수 있는 비어있는 클래스를 구현하여 null 대신에 사용한다.

 

UML 다이어그램

 

반응형