싱글톤 패턴이란
객체의 인스턴스는 단 1개만 존재하며 (유일성)
static(전역)으로 사용하면서 다른 클래스에서 손쉽게 접근 할 수 있는 클래스 (접근성).
를 나타내는 디자인 패턴이다.
말만 들으면 무슨 말인지 단박에 알아채기는 쉽지 않다.
한번 유니티에서 어떤 식으로 사용되는지 알아보자.
게임 개발을 하다보면 게임의 전범위에 걸쳐서 동작을 해야하는 기능들이 있다.
예를 들어 게임의 효과음이나 BGM들을 관리하는 SoundManager와
UI들을 관리하는 UIManager가 있다.
이런식으로 UI를 관리한다면 UIManager, 소리를 관리한다면 SoundManager라는 식으로 관리할 기능에 Manager를 붙히는 것이 관례이다.
using UnityEngine;
public class GameManager : MonoBehaviour
{
public static GameManager Instance = null;
public string TestSt = "This is SingleTon!!";
private void Awake()
{
if(Instance != null) { Destroy(Instance); } // 유일성을 보장하기 위해
Instance = this;
DontDestroyOnLoad(gameObject);
}
}
가장 기본적인 싱글톤의 구조이다.
전역변수로 자기 자신의 인스턴스를 가지고 Awake에서 Instance를 자기 자신으로 설정해준다.
이때, 싱글톤의 특징인 유일성(인스턴스는 단 1개)을 보장하기 위해 만약 자기 자신 이외에 Instance가 존재한다면 존재하는 Instance를 삭제해준 후 자신으로 Instance를 바꿔준다.
추가로 유니티에서는 새로운 씬을 불러올 때 이전 씬에 있던 모든 오브젝트를 삭제하므로 삭제되지 않기 위해 DontDestroyOnLoad를 해준다.
public class Test : MonoBehaviour
{
void Start()
{
Debug.Log(GameManager.Instance.TestSt);
}
}
이런식으로 작성한 GameManager에 있는 public 변수를 다른 클래스에서 접근 할 수 있는 것을 확인할 수 있다.
프로젝트가 커지다보면 싱글톤 클래스의 수가 많아지게 된다.
이럴때 싱글톤을 하나하나 전부 구현하는 것은 귀찮기 때문에 Monosingleton을 이용하는 방법을 사용한다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public abstract class MonoSingleton<T> : MonoBehaviour where T : MonoBehaviour
{
private static T instance;
public static T Instance
{
get
{
if (instance == null)
{
instance = FindObjectOfType<T>();
if (instance == null)
{
GameObject obj = new GameObject(typeof(T).Name);
instance = obj.AddComponent<T>();
}
}
return instance;
}
}
}
이런식으로 제네릭을 활용해 MonoSingleton을 구현해준다면
using UnityEngine;
public class GameManager : MonoSingleton<GameManager>
{
public string testSt = "This is SingleTon!!";
}
이렇게 MonoSingleton을 상속받아주면 싱클톤 클래스가 된다,
오우 그럼 굳이 참조할 필요 없이 접근하기 쉽게 싱글톤을 최대한 많이 써야겠네?
아니다.
싱글톤을 남용하면 안되는 이유는 여러가지가 있다.
싱글톤은 클래스의 인스턴스를 static으로 해주어야만 한다.
그렇기 때문에 싱글톤 클래스가 많아질수록 고정적으로 메모리에 할당되야할 양이 점점 늘어나게 되는 문제가 생긴다.
싱글톤 패턴을 광범위하게 사용하면 코드 리팩토링이 어려워진다. 하나의 싱글톤 인스턴스가 여러 곳에서 참조되고 사용되기 때문에, 코드를 수정할 때 그 영향을 정확히 파악하고 수정하는 것이 복잡해진다.
대표적으로 싱글톤은 이와 같은 단점들이 있기 때문에 싱글톤 클래스를 만들 때는 이 클래스가 정말 싱글톤이여야 하는지 생각해보고 신중히 만들어야 한다.