공부블로그

[공부 블로그] 모노싱글톤

bimtaeur30 2025. 11. 6. 15:30

안녕하세요.

요즘엔 유니티 엔진 프로젝트 수행평가 준비가 한창이라서 블로그 글쓰는게 오랜만인 것 같습니다.

오늘은 모노싱글톤에 대해서 알아보겠습니다.

 

저는 모노싱글톤의 존재를 모를땐 Manager 스크립트마다 하나하나 싱글톤을 구현하곤 했습니다.

이 방식은 매번 싱글톤을 구현해야하기 때문에 번거롭습니다.

그래서 모노싱글톤을 배우고 사용했을땐 매우 만족스러웠습니다. 모노싱글톤이 한개만 있으면 굳이 다른 매니저 스크립트들을 싱글톤으로 구현하지 않아도 되기 때문입니다.

 

그럼 시작하기 전에 모노싱글톤이 무엇인지 정확히 짚고 넘어가겠습니다.

모노싱글톤이란? 유니티에서 싱글 디자인패턴을 구현할때 Monobehaviour를 상속받는 클래스에 적용하는 방식을 말합니다.

 

이제 모노싱글톤 코드를 가져와 설명을 진행하겠습니다.

using UnityEngine;

public class MonoSingleton<T> : MonoBehaviour where T : MonoSingleton<T>
{
    private static T _instance;
    public static T Instance
    {
        get
        {
            // 이미 인스턴스가 있다면 그대로 반환
            if (_instance != null)
                return _instance;

            // 씬에서 찾기
            _instance = FindFirstObjectByType<T>();

            // 없으면 새 GameObject 생성
            if (_instance == null)
            {
                GameObject obj = new GameObject(typeof(T).Name);
                _instance = obj.AddComponent<T>();
            }

            return _instance;
        }
    }

    protected virtual void Awake()
    {
        // 중복 방지
        if (_instance == null)
        {
            _instance = this as T;
            DontDestroyOnLoad(gameObject); // 씬 이동해도 유지
        }
        else if (_instance != this)
        {
            Destroy(gameObject);
        }
    }
}

 

해당 코드에서 public class MonoSingleton<T> : MonoBehaviour where T : MonoSingleton<T> 는 모노싱글톤을 상속받는 코드가 T : MonoSingleton<T>의 구조를 띄어야한다는 제약을 걸어줍니다. 

 

Instance의 프로퍼티에 대해서도 알아보겠습니다. 해당 프로퍼티는 set이 없기 때문에 읽기전용프로퍼티입니다.

여기서 하나만 짚고 넘어가자면 _instance와 Instance가 존재하는 이유는 캡슐화 때문입니다.

캡슐화를 하는 이유는 실제 값을 저장하는 변수를 외부에 노출시키지 않고, 값을 내부에서 할당해주기 위함입니다.

get 안에 적혀있는 코드들은 주석을 참고해주시면 감사하겠습니다.

 

Awake 안에서는 일반적인 싱글톤처럼 중복방지와 씬을 이동해도 유지되는 코드를 작성해 주었습니다.

 

모노싱글톤 코드 설명은 여기까지 하면 될 것 같습니다.

감사합니다.