개발 TIL

6/21 부트캠프 개발 TIL (디자인 패턴)

HJTL 2024. 6. 26. 22:48

특강내용중 디자인패턴, 옵저버, 전략에 대해서 정리한다.

디자인 패턴

관찰자 패턴

1:N 종속 관계로 오브젝트가 통신하고 낮은 결합도를 유지

한 오브젝트가 업데이트 하면 통신된 다른 오브젝트들이 반응을 받는다.

위 그림처럼 위의 서버가 데이터를 전달하면 클리이언트가 보낸 데이터를 받는 개념이라고 보면 될것 같다.

 

유니티에서 구현해보면 일방적으로 싱글톤을 받아서 구현을 해보면

//QualliManager.cs
public class QualliManager : MonoBehaviour
{
    public static QualliManager Instance;

    public bool onSale = false;

    private void Awake()
    {
        Instance = this;
    }

    void Start()
    {
        StartCoroutine(ItemArrived());
    }

    private IEnumerator ItemArrived()
    {
        float wt = Random.Range(1f, 3f);
        Debug.Log($"{wt}초 대기시작");

        yield return new WaitForSeconds(wt);

        onSale = true;
    }
}
//ItemObserver.cs
public class ItemObserver : MonoBehaviour
{
    public string name;

    void Update()
    {
        if(QualliManager.Instance.onSale)
        {
            CheckSale();
        }
    }

    private void CheckSale()
    {
        Debug.Log($"{name} 당장 사");
    }
}

이런 방법보다 event(Action)키워드를 사용하여 

 

//QualliManager.cs
public class QualliManager : MonoBehaviour
{
    public static QualliManager Instance;
    public Action saleAction;

    private void Awake()
    {
        Instance = this;
    }

    void Start()
    {
        StartCoroutine(ItemArrived());
    }

    private IEnumerator ItemArrived()
    {
        float wt = Random.Range(1f, 3f);
        Debug.Log($"{wt}초 대기시작");

        yield return new WaitForSeconds(wt);

        saleAction();
    }
}
//ItemObserver.cs
public class ItemObserver : MonoBehaviour
{
    public string name;

    void Start()
    {
        QualliManager.Instance.saleAction += CheckSale;
    }

    private void CheckSale()
    {
        Debug.Log($"{name} 당장 사");
    }
}

CheckSale이 한번 호출 되었다는 것을 볼수 있다.

 

이렇게 Update문으로 대기하는 방법보다 Action으로 받을 이벤트를 연결하여 QualliManager의 saleAction을 호출하여 연결했던 CheckSale이 호출이 되게 하는 방법이 좋은 예시이다.

 

이게 무슨상관이냐?

개념에서 설명했던 서버가 보낸 데이터를 클라이언트가 받아야 되는데 클라이언트가 데이터를 받았다면 신호를 계속 울리면 귀찮아질 것이다. 그래서 한번 받으면 받았다고 알림을 한번 울려라 라는 식으로 구현이 된다는 것이다.

(다른 클래스에서도 구현할때 마찬가지일 것이다.)

 

결론적으로 관찰자 패턴의 장점은 낮은 결합도, 런타임 옵저버 추가 및 제거가 용이, C# 유니티에서 구현이 용이하고

단점은 시스템 복잡성이 증가하고 관찰자 사이에 호출 순서가 모호하고 옵저버 파괴시 함수를 파괴하지 않을 경우 메모리 누수가 발생할 수 있다.


전략 패턴

전략패턴은 구현한 게임에서 캐릭터나 아이템 등을 추가하고 싶을 때 SO를 만들어 클래스화 하여 콘텐츠를 추가할 수 있는 기법이다.

쉽게 말하자면 DLC기능이랑 보면 될것 같다.

 

by 스파르타 코딩클럽