Search

싱글턴 패턴

class
디자인 패턴
상태
완료
날짜
목차

싱글턴 패턴

싱글턴 패턴의 주요 목적은 유일성을 보장하는 것입니다.
클래스가 싱글턴 패턴을 제대로 구현했다면, 초기화된 후에는 런타임 동안 메모리에 오직 하나의 인스턴스만 존재한다는 것을 의미합니다.
이 매커니즘은 일관되고 유일한 진입점에서 전역적으로 접근할 수 있는 시스템을 관리하는 클래스가 있을 때 도움이 됩니다.

싱글턴 패턴의 특징

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는 전역적으로 접근 가능하며, 메모리상에서 단 하나만 존재합니다.