싱글톤 패턴(Singleton Pattern)은 클래스 인스턴스를 하나만 만들고, 그 인스턴스로의 전역 접근을 제공
하는 디자인 패턴을 말한다.
싱글톤 패턴은 클래스에서 하나뿐인 인스턴스를 관리하도록 만들어야 되며, 다른 어떤 클래스에서도 자신의
인스턴스를 추가로 만들지 못하게 해야 한다. 혹여나 인스턴스가 필요하다면 반드시 클래스 자신을 거치도
록 해야 한다.
유니티에서는 주로 Awake() 함수에서 인스턴스를 할당하고, Destroy() 함수에서 인스턴스를 해제해준다.
싱글톤 객체는 그 인스턴스에 접근할 수 있도록 전역 접근자를 제공해야 한다. 언제 어디서든 필요하면 해당
클래스에 요청할 수 있게 만들어 줘야 한다.
싱글톤 패턴(Singleton Pattern)은 인스턴스를 하나만 가지고 있는 객체에 적용하면 좋기 때문에 프로그램에서 하나의 인스턴스만 있어도 되는 공통 항목에 사용하면 좋다.
유니티에서 예를 들면 게임의 흐름을 주관하는 게임 매니저, 공통으로 UI를 관리하는 UI 매니저, 사운드를 처리해주는 사운드 매니저 클래스처럼 프로그램 내 하나만 존재해야 되는 매니저 클래스 등에 많이 활용된다.
using UnityEngine;
namespace SingletonPattern
{
public class GameManager : MonoBehaviour
{
public static GameManager Instance { get; private set; }
private void Awake()
{
Instance = this;
}
private void OnDestroy()
{
Instance = null;
}
}
}
싱글톤 객체를 만드는 건 몇가지 있는데 그중 가장 간단하게 코딩하는 방법은 프로퍼티를 사용하는 방법이
다.
인스턴스를 넣어주는 작업은 외부에서 하면 안 되기 때문에 private set으로 설정하고, 외부에서 해당 객체
를 가져올 수 있도록 get을 통해 열어준다.
유니티 기본 함수인 Awake()함수에서 Instance에 본인 클래스 객체를 할당해주며, Destroy() 함수에서 해
제해준다.
위 방법의 단점은 해당 GameManager 스크립트가 붙어있는 GameObject가 Scene에 존재하고 있
어야 되는 점이다. 현재 Scene에서 GameManager를 가지고 있는 GameObject가 없다면, null 레퍼런스
익셉션이 발생한다.
Instance 가 null일 경우를 대처하지 못하는 위의 방식을 개선해 보면, null 일 경우 GameObject를 하나 생성하고, 생성된 GameObject에 GameManager 컴포넌트를 Attach한 후, 해당 컴포넌트를 인스턴스에 넣어주는 작업을 통해 보완이 가능하다.
using UnityEngine;
namespace SingletonPattern
{
public class GameManager : MonoBehaviour
{
private static GameManager _instance = null;
// Static 변수를 통해 해당 인스턴스를 외부에서 접근 가능하게 함.
public static GameManager Instance
{
get
{
if(_instance == null)
{
//인스턴스가 없을 경우, GameObject를 생성 후 인스턴스를 만들어 준다.
GameObject obj = new GameObject("GameManager");
obj.AddComponent<GameManager>();
_instance = obj.GetComponent<GameManager>();
}
return _instance;
}
private set { _instance = value; }
}
private void Awake()
{
_instance = this;
}
private void OnDestroy()
{
_instance = null;
}
public void Call()
{
Debug.Log("Call");
}
}
}
싱글톤 패턴은 만들기 쉽고 다른 스크립트에서 워낙 강력한 접근성을 제공하는 개발 패턴이다.
하지만 싱글톤을 남발한다면, 코드의 추적이 어려워지는 단점도 존재하며, private 객체를 가지고 있어야 하므로 상속하면 안 되는 구조적 한계가 있다.
프로그램 내 한 가지 기능만을 위한 하나의 인스턴스만 필요한 경우에 싱글톤을 적용하면 좋을 것 같다.