싱글톤 패턴은 개발을 시작 할 때 제일 먼저 접하게 되는 디자인 패턴이 아닐까 싶다.
싱글톤에 대한 내용은 이미 정리되어 있는 것도 많지만 내 기준으로 이해가 어려웠던 부분을 따로 작성하고 싶어서 작성한 글이다.
프로그램 전체에서 오직 하나만 존재하는 객체를 만들어, 어디서든 전역으로 접근할 수 있도록 하는 디자인 패턴이다.
오브젝트를 매번 Find, GetComponent 를 사용하면 느리고 비효율적이며 반복적이고 성능 저하를 일으킨다.
- 어디서든 간단하게 접근 가능
- 유일한 인스턴스를 자동으로 관리
- 중복 생성 방지 (하나만 생성)
- 코드 간결, 성능 안정, 유지보수 용이
(싱글톤 구현에도 다양한 방법이 있지만, 아래 코드는 MonoBehaviour를 상속 받는 구조이다.)
public class GameManager : MonoBehaviour
{
private static GameManager s_instance;
public static GameManager Instance { get { Init(); return s_instance;} }
private static void Init()
{
if (s_instance != null)
return;
GameObject go = GameObject.Find("@Managers");
if (go == null)
{
go = new GameObject("@Managers");
go.AddComponent<GameManager>();
}
s_instance = go.GetComponent<GameManager>();
DontDestroyOnLoad(go);
}
private void Awake()
{
Init(); // 혹시 모를 중복 대비
}
}
- get property를 사용 해, 값을 읽을 때 하고 싶은 일을 넣을 수 있다. 즉 단순히 값만 읽는것이 아니라 Init() 함수를 호출해서 생성 여부를 확인하고 s_instance값을 리턴하는 함수처럼 작동하는 속성이다.
- 동적으로 자기 자신을 생성하고 관리하는 방식이다. Pure C# 싱글톤이나 다른 싱글톤 구조는
씬에 미리 붙여두는 방식을 사용 해야 하는데, 이러한 구조는 씬에 붙여두지 않고
Instance를 처음 호출하는 시점에서 자동으로 생성된다.- Monobehaviour를 상속 받기 때문에 Unity기능 사용이 가능하다.
즉 UI,사운드 등 적용하기 용이하다.
- 에디터에선 생성 시점이 헷갈릴 수 있다.
- 중복 방지 로직이 중요하다. (ex. Awake()에서 중복 제거)
- 초기화 순서 제어가 어렵다.
단순히 "하나만 쓰자" 가 아니라 중복 없이 안전하고 쉽게 쓸 수 있게 만드는 구조화된 방법 이다. Instance를 전역에서 접근할 수 있으니 남발 하지말고 꼭 필요한 기능만 추가해서 사용하자.
덕분에 싱글톤에 대해 더 배우고 갑니다^^