Unity - 싱글톤 패턴

2024. 5. 21. 19:41Unity/Unity 학습정리

  주로 사용하는 싱글톤 패턴을 제너릭을 이용해서 구현해보는 시간을 가졌다. 매번 매니저오브젝트와 스크립트를 구현하면서 싱글톤을 사용했는데 사용할 때마다 스크립트에 싱글톤을 구현해주는 방식으로 했다.

  그러다보니 여러 싱글톤 객체가 생기기 시작했을때 똑같은 코드가 반복되는 현상도 발생했다. 제너릭으로 구현하게되면 싱글톤을 만드는 것도 간단하고 코드가 반복되지 않는 장점이 있다.

 

목차

  1. 제너릭 싱글톤 클래스 생성
  2. 싱글톤 객체 생성
  3. 싱글톤 패턴의 장점과 단점
  4. 마무리

     


     


    제너릭 싱글톤 클래스

      먼저 제너릭에 대해서 알아야 하는데, 제너릭은 동일한 기능을 수행하지만 다른 데이터를 받아서 처리할 때 유용하다. 매번 다른 데이터값에 대한 처리를 하기위해서 여러 메서드나 클래스를 작성하는것은 매우 비효율적이기 때문에 제너릭 타입을 이용해서 하나의 메서드를 작성하고 여러 데이터에 대해서 처리할 수 있게 한다.

      예를들어 C#에서 Queue도 제너릭으로 구현되어있는데 Queue<T> 타입에 String, int, float, GameObject등 다양한 타입의 데이터가 들어가더라도 동일한 Queue자료구조의 데이터처리를 받게 된다.

     

    싱글톤도 결국 동일한 기능을 수행하지만 각 매니저의 타입에 따라 처리를 할 수 있게 만든다.

     

    public class Singleton<T> : MonoBehaviour where T : MonoBehaviour
    {
        private static T instance;
    
        public static T Instance
        {
            get
            {
                if(instance == null)
                {
                    GameObject obj;
                    obj = GameObject.Find(typeof(T).Name);
                    if(obj == null) 
                    { 
                        obj = new GameObject(typeof(T).Name);
                        instance = obj.AddComponent<T>();
                    }
                    else
                    {
                        instance = obj.GetComponent<T>();
                    }
                }
                return instance;
            }
        }
    
        public void Awake()
        {
            DontDestroyOnLoad(gameObject);      
        }
    }

    천천히 살펴보자면 클래스 선언부에 Singleton이름을 가진 클래스이고 <T> 제너릭 타입을 받는다.

    • where 키워드를 통해 제너릭에 제약을 두는데 T : ~ 이면 T는 항상 ~을 상속받아야 하는것이다. 위는 Monobehaviour을 꼭 상속받아야하는 클래스만 Singleton<T>로 객체를 만들 수 있다.
    • instance를 null체크하고 GameObject도 존재하는지 체크를해서 null이라면 새로운 GameObject를 만들어 해당 컴포넌트에 <T>타입의 제너릭을 컴포넌트로 붙혀주는 것이다.
    • 만약 instance가 존재한다면 해당 컴포넌트를 가져와 리턴한다.

     

    싱글톤 객체 생성

      제너릭 싱글턴 클래스가 만들어져있다면 싱글톤 객체 생성은 그렇게 어렵지 않다.

    using UnityEngine;
    
    public class GameManager: Singleton<GameManager> 
    {
     
    }

    간단하게 Singleton클래스를 상속받은 게임매니저 클래스를 생성하면 된다. Singleton이 원래 Monobehaviour를 상속받고있기 때문에 제약조건에도 부합한다.


     

    싱글톤 패턴 장점과 단점

      단점 

    • 코드간의 의존성이 강해진다. 싱글톤으로 만들어진 객체를 사용하는 다른 객체들이 싱글톤 객체를 의존하게 된다.
    • 디버깅시에 서로 독립적이지 않기 때문에 테스트하기가 힘들다.

      장점

    • 전역에서 쉽게 접근이 가능하다.
    • n개의 객체만 존재하게 하고 싶을때 유용하다.

     

    마무리

      제너릭으로 구현하는것이 코드의 가독성도 좋아지고, 불필요한 반복 작업을 하지 않을 수 있기 때문에 그런 부분에서도 좋은것 같다. 씬에 오브젝트가 존재하지 않을때도 예외처리가 가능한 부분이 발생하는 장점도 있다.

      이렇게 구현해놓은 싱글톤 제너릭 코드는 어느 프로젝트에도 적용이 가능한 자산이라고 생각이 든다. 범용적으로 사용할 수 있는 코드들을 구현해놓으면 추후에 어느 프로젝트던 끌어와서 사용할 수 있단 생각이 들고, 그런 코드들을 만들고 싶단 생각이 들었다.

    'Unity > Unity 학습정리' 카테고리의 다른 글

    Unity - Scriptable Object  (0) 2024.05.27
    Unity - Object Pool  (0) 2024.05.23
    Unity - Vector2.Dot으로 시야각 구하기  (0) 2024.05.17
    Unity - 각도 구하기  (0) 2024.05.16
    Unity - LayerMask  (0) 2024.05.09