본문 바로가기
Study

디자인 패턴, Singleton Pattern (단일 인스턴스 패턴)

by Client. DJ 2022. 1. 31.
반응형

싱글턴 패턴이란?

디자인 패턴하면 가장 흔하게 접하게 되는 패턴으로, static 클래스와 비슷하게 단일 인스턴스로 클래스를 사용하는 개념입니다.

예제

Singleton.cs

public abstract class Singleton<T> where T : Singleton<T>, new()
{
    private static T instance = null;
    public static T Instance
    {
        get
        {
            if (instance == null)
            {
                instance = new T();
                instance.Initialize();
            }
            return instance;
        }
    }

    ~Singleton()
    {
        Release();
    }

    public static bool IsLive => instance != null;
    protected abstract void Initialize();
    protected abstract void Release();
}

가장 기본적인 형태의 싱글턴 패턴입니다.

static 클래스와 싱글턴 패턴의 차이점?

  • 사용 원리는 static class와는 다름이 없지만, 객체 지향적인 관점에서는, 동일 클래스를 사용하는 객체 간 공통적으로 사용해야하는 경우, static 메소드를 사용을 하기에 static으로만 구성된 방법으로 쓰는 경우에는 위배됩니다.
  • static 클래스는 컴파일 타입으로, 스택 메모리를 사용합니다. 이 말은 사용하지 않았음에도 고정적인 메모리가 자리를 잡고 있으며, 싱글턴은 새로 생성을 하기 때문에 힙 메모리를 사용합니다. 싱글턴과는 다른 방식의 메모리 사용을 합니다.

 

 그 외 다른점은 알아보면 많이 나오지만, 결정적인 이유는 앞서 언급한 두가지의 이유만 인지하셔도 되겠습니다. 😊

유니티 Monobehaviour Singleton

SingletonBehaviour.cs

using UnityEngine;

public abstract class SingletonBehaviour<T> : MonoBehaviour where T : MonoBehaviour
{
    private static T instance = null;
    public static T Instance
    {
        get
        {
            if (instance == null)
            {
                instance = FindObjectOfType(typeof(T)) as T;
            }
            return instance;
        }
    }

    protected virtual void OnDestroy()
    {
        if (IsLive) instance = null;
    }

    public static bool IsLive => instance != null;
}

유니티 Monobehaviour 버전입니다. 단일 싱글턴 오브젝트로 사용할 때 사용합니다. ex) GameManager

주의

싱글턴이기에 너무 쉽게 남용하는 경우가 있습니다. 이는 순서보장이되지 않아, 절차지향인 부분에 위배되는 영향도 끼치는 경우가 많습니다. 필요한 경우 적당하게 사용을 하는 것이 좋겠습니다. (싱글턴에 의존적이지 마세요!)

 

 새로 프로젝트를 진행할 때마다, 싱글턴 클래스를 만들게 되는데 매번 번거로워서 개인적인 소장용도로 게시물을 올리게 되었습니다. 아유 귀찮아라~

반응형

댓글