목차
싱글턴 패턴
싱글턴 패턴의 주요 목적은 유일성을 보장하는 것입니다.
클래스가 싱글턴 패턴을 제대로 구현했다면, 초기화된 후에는 런타임 동안 메모리에 오직 하나의 인스턴스만 존재한다는 것을 의미합니다.
이 매커니즘은 일관되고 유일한 진입점에서 전역적으로 접근할 수 있는 시스템을 관리하는 클래스가 있을 때 도움이 됩니다.
싱글턴 패턴의 특징
1.
싱글턴 클래스는 오직 한 번만 메모리 안에 생성되어야 합니다.
2.
자기 자신과 같은 유형의 개체 인스턴스를 발견 시 즉시, 없앤다. 혹은 인스턴스 자체를 만들지 않습니다.
3.
위 사항은 상당히 엄격하며 그 어떤 경쟁도 용납되지 않습니다.
장단점
장점
1.
전역 접근 가능 : 전역 접근점을 만들 수 있습니다.
2.
메모리 사용 최적화 : 인스턴스가 단 하나만 생성되기 때문에, 해당 클래스의 다수 인스턴스를 만들어 메모리를 소모하는 일이 없습니다.
단점
1.
유닛 테스트 : 싱글턴을 과도하게 사용하면, 유닛 테스트가 어려워집니다. 싱글턴 오브젝트가 다른 싱글턴에 종속될 수 있습니다. 즉, 단독으로 테스트하고 디버그하는 것은 불가능합니다.
2.
잘못된 습관 ; 싱글턴은 사용하기 쉬워 잘못된 프로그래밍 습관이 생길 수 있습니다. 싱글턴으로 어디서나 모든 것에 쉽게 접근하게 만들 수 있기 때문에, 코드 작성 시 보다 정교하게 접근하여 테스트하는 것이 귀찮게 느껴질 수 있습니다.
싱글턴 클래스 구현
using UnityEngine;
namespace Chapter.Singleton
{
public class Singleton<T> :
MonoBehaviour where T : Component {
private static T _instance;
public static T Instance
{
get
{
if (_instance == null)
{
_instance = FindObjectOfType<T>();
if (_instance == null)
{
GameObject obj = new GameObject();
obj.name = typeof(T).Name;
_instance = obj.AddComponent<T>();
}
}
return _instance;
}
}
public virtual void Awake()
{
if (_instance == null)
{
_instance = this as T;
DontDestroyOnLoad(gameObject);
}
else
{
Destroy(gameObject);
}
}
}
}
C#
복사
Singleton<T> 클래스의 get 프로퍼티로 싱글톤을 구현했습니다.
public static 속성으로 구현함으로써 전역에서 접근 가능합니다.
get을 통해 접근할 때, FindOjbectOfType을 통해 해당 클래스의 로드된 오브젝트를 검색하고 (만약 _instance가 null이라면) 로드된 클래스가 있다면, 해당 클래스를 반환합니다. 없다면 GameObject를 새로 만들어서 컴포넌트를 추가후 해당 컴포넌트를 반환합니다.
Awake에선 만에 하나라도 두 개의 같은 클래스가 존재할 경우 해당 객체를 제거합니다. 거의 발생하지 않겠지만, 씬에 직접 넣는다거나 다음 씬에 실수로 해당 클래스가 담겨있는 오브젝트가 있을 경우 삭제하는 방법입니다.
싱글턴 게임매니저 간단 구현.
using System;
using UnityEngine;
using UnityEngine.SceneManagement;
namespace Chapter.Singleton
{
public class GameManager : Singleton<GameManager>
{
}
}
C#
복사
싱글톤 클래스를 상속받음으로써 게임매니저는 싱글톤 특성을 얻게 되었습니다.
이제 GameManager는 전역적으로 접근 가능하며, 메모리상에서 단 하나만 존재합니다.