본문 바로가기
NOTE/Programming

[C#] Singleton

by DevAthena 2016. 10. 5.

싱글톤을 만드는 방법에는 여러가지가 있지만,

프로퍼티를 이용하여 사용하기 편하게 하는 것이 좋다.


1.

public class InputManager : MonoBehaviour {
    private static InputManager _inputInstance;
 
    public  static InputManager Instance
    {
        get
        {
            if(_inputInstance == null)
            {
                _inputInstance = FindObjectOfType(typeof(InputManager)) as InputManager;
                if(_inputInstance)
                {
                    GameObject container = new GameObject();
                    container.name = "InputManagerObj";
                    _inputInstance = container.AddComponent(typeof(InputManager)) as InputManager;
                }
            }
            return _inputInstance;
        }
    }
}

이것은 처음 _inputInstance 변수가 생성되지 않았을 때 

이 스크립트가 붙어있는 GameObject에 있는 Component중에 찾아보고,

없으면 새로 GameObject(InputManagerObj)를 만들어서라도 싱글톤 객체를 만들어 넘겨주는 것

현재 위 소스는 MonoBehaviour를 상속 받았는데, 이건 GameObject에 Component로 붙겠다는 것이고

그 상황에서 필요한 함수와 변수들을 상속받는다는 것이다. 또한, GameObject에 붙어 사용되므로 

new 연산자를 이용하여 아무데나 메모리를 할당 할 수 없다.


2.

public class SingleTon
{
    private static SingleTon instance;
 
    public static SingleTon getInstance
    {
        get
        {
            if (instance == null)
            {
                instance = new SingleTon();
            }
 
            return instance;
        }
    }
 
    public int TEST { set; get; }
}

MonoBehaviour를 상속받지 않는 경우, instance가 null일 때 new로 메모리를 할당해주지만

Inspector창에서 변수 값을 조절할 수 없다.


3. 최애방법

public class Singleton<T> : MonoBehaviour where T : MonoBehaviour {
    private static T _instance = null;
 
    public static T Instance
    {
        get
        {
            if(_instance == null)
            {
                _instance = (T)FindObjectOfType(typeof(T)) as T;
                if(_instance == null)
                {
                    Debug.Log("Singleton object null");
                }
            }
            return _instance;
        }
    }
}
// InputManager.cs
public class InputManager : Singleton<InputManager> {
    public void TEST()
    {
        Debug.Log("InputManager singleton TEST");
    }
}

//GetTest.cs
public class GetTest : Singleton<InputManager> {
    void Awake()
    {
        InputManager.Instance.TEST();
    }
}

제네릭 싱글톤으로 싱글톤을 따로 빼서 재사용성을 극대화 한다.


'NOTE > Programming' 카테고리의 다른 글

[C++] 문자열을 입력받는 12가지 방법 (펌)  (0) 2018.04.01
[C#] 열거형 형식  (0) 2016.11.08
[C#] Func & Action 델리게이트 (펌)  (0) 2016.09.29
[C#] 람다식 (펌)  (0) 2016.09.29
[C#] 컬렉션  (0) 2016.09.28