실리의 프로그램 사이트

Unity Singleton을 제네릭으로 만들어놓고 써봅시다. 본문

Unity 강좌

Unity Singleton을 제네릭으로 만들어놓고 써봅시다.

sillyknight 2017. 3. 23. 14:46

안녕하세요.

 

오늘은 유니티에서 자주 사용하는 대표적인 디자인 패턴인 Singleton을 쉽게 사용하기 위하여 제네릭으로 만들 겁니다.

 

제네릭이란 C++ 을 사용하신 분은 다들 아시는 템플릿과 비슷한 개념인데요.

 

유니티를 사용하는 상황에서는 C#을 쓰기 때문에 C++과는 차이점이 존재합니다.

 

아래는 Msdn에서 정의되어 있는 C#의 제네릭과 C++의 템플릿과의 주요 차이점입니다.

 



  • C# 제네릭은 C++ 템플릿과 같은 정도의 융통성을 제공하지 않습니다. 예를 들어, C# 제네릭 클래스에서 사용자 정의 연산자를 호출할 수는 있지만 산술 연산자를 호출할 수는 없습니다.
  • C#에서는 template C<int i> {} 같은 비형식 템플릿 매개 변수를 허용하지 않습니다.
  • C#에서는 명시적 특수화를 지원하지 않습니다. 즉, 특정 형식에 대한 템플릿을 사용자 지정하여 구현할 수 없습니다.
  • C#에서는 부분 특수화를 지원하지 않습니다. 즉, 형식 인수의 하위 집합을 사용자 지정하여 구현할 수 없습니다.
  • C#에서는 형식 매개 변수를 제네릭 형식에 대한 기본 클래스로 사용할 수 없습니다.
  • C#에서는 형식 매개 변수에 기본 형식을 사용할 수 없습니다.
  • C#에서는 생성된 형식을 제네릭으로 사용할 수는 있지만 제네릭 형식 매개 변수 자체가 제네릭이 될 수는 없습니다. C++에서는 템플릿 매개 변수를 허용합니다.
  • C++에서는 템플릿의 모든 형식 매개 변수에 대해서는 유효하지 않을 수 있는 코드가 허용되며 이러한 코드는 형식 매개 변수로 사용되는 특정 형식에 대해 검사를 받습니다. C#에서는 제약 조건을 충족하는 모든 형식과 함께 사용할 수 있도록 클래스의 코드를 작성해야 합니다. 예를 들어, C++의 경우 형식 매개 변수의 개체에 대해 +  - 산술 연산자를 사용하는 함수를 작성할 수 있습니다. 이 경우 이러한 연산자를 지원하지 않는 형식으로 템플릿을 인스턴스화할 때 오류가 발생합니다. C#에서는 이러한 함수를 작성할 수 없고 제약 조건에서 추론 가능한 언어 구문만 사용할 수 있습니다.

 

이것 외에도 구현 부분에서 가장 큰 차이점은 C#의 제네릭 형식 대체는 런타임에 수행되므로 인스턴스화된 개체에서 

 

제네릭 형식 정보가 유지된다는 점입니다.

 

위에 부분을 숙지 하시고 제네릭을 만들어 봅시다. 

 

using UnityEngine;

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);
    }
}

 

 

자 위와 같이 비교적 쉽게 만들 수 있는데요. Manager를 만들 시 우리는 보통 Singleton 형태로 만드는데요. 아래와 같이 하

 

시면 끝입니다.

 

 

using UnityEngine;


public class Manager: Singleton<Manager> {
 
}

 

 

다들 즐거운 코딩하시고 싱글톤은 앞으로 제네릭으로 만들어 놓고 편하게 쓰시길 바랍니다.

 

감사합니다.

 

 

Comments