프로그래밍 디자인 패턴 중 추상 객체 인스턴스 생성 패턴 중의 하나이다.
<aside> <img src="/icons/briefcase_gray.svg" alt="/icons/briefcase_gray.svg" width="40px" /> 유니티에서 싱글톤의 역할
싱글톤은 전역에서 접근이 가능하기에[Static] 원하는 스크립트에서 불러와서 마음대로 사용이 가능하다.
⇒ 주로 게임의 전체를 관장하는 스크립트에 싱글톤을 사용한다.
Public으로 매 스크립트마다 연결하는 것은 메모리 사용이 스크립트의 수의 배수만큼 증가하지만, 싱글톤을 사용하면 한 메모리의 할당만으로 원하는 스크립트의 기능을 가져올 수 있다.
⇒ 자주 쓰는 스크립트의 메모리 사용을 크게 줄일 수 있다.
즉, 모든 스크립트가 써야 하는 변수나 기능을 관장하는 스크립트가 있다면, 접근의 편의와 메모리의 할당을 줄이기 위해 싱글톤 패턴을 사용한다.
</aside>
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class SingleTon : MonoBehaviour
{
public static SingleTon instance = null;
Awake() {
if(instance == null) {
instance = this;
} else if(instance != this) {
Destroy(this.gameObejct);
}
DontDestroyOnLoad(this.gameObject);
}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class SingleTon
{
private static GameMgr instance;
public static GameMgr Instance
{
get{
if(null == instance){
instance = new GameMgr();
}
return instance;
}
}
public GameMgr(){
}
}
<aside> <img src="/icons/dialogue_gray.svg" alt="/icons/dialogue_gray.svg" width="40px" /> Monobehaviour를 상속받지 않는 경우의 좋은 점 :
씬 이동을 신경쓰지 않아도 된다.
씬 이동을 했을 떄 그 씬의 Hierarchy에 같은 싱글톤 클래스가 존재한다면, 기존씬에서 쓰던 인스턴스를 계속 쓸지, 아니면 새로운 씬의 Hierarchy에 있는 인스턴스를 쓸지 선택해야 한다. 하지만 Monobehaviour를 상속받지 않고 메모리상에만 존재하게 된다면 이런 선택의 경우를 고려하지 않아도 된다.
현재 상용 버전의 유니티 오브젝트라면 모두 갖게 될 Transform컴포넌트를 안 가져도 되니 쓸데 없는 메모리 점유를 안해도 된다.
하지만 눈에 안보이면 햇갈릴 수 있으니 보통 첫번째 방법을 사용한다.
</aside>
<aside> <img src="/icons/clover-four-leaf_gray.svg" alt="/icons/clover-four-leaf_gray.svg" width="40px" /> 싱글톤의 장점
메모리 낭비가 줄어든다.
전역으로 접근이 가능해서 가져올 필요 없이 어느 스크립트에서나 사용할 수 있다.
</aside>
<aside> <img src="/icons/new-alert_gray.svg" alt="/icons/new-alert_gray.svg" width="40px" /> 싱글톤의 단점
전역변수가 가지는 모든 단점을 그대로 가진다.
접근이 쉽다보니 게임이 비대칭적인 크기로 만들어질 수 있다.
⇒ 너무 많은 데이터를 넣으면 유지관리가 힘들어진다.
Single Responsibility Principle과, 수정에는 닫히고 확장에는 열려야 한다는 Open-Closed Principle 등의 원칙을 어길 수 있으며, 클래스들과 싱글톤, 그리고 싱글톤이 가지고 있는 클래스 인스턴스들간의 의존도가 복잡해져서 게임 업데이트를 하려면 게임 전체를 갈아엎어야 될 수도 있다.
싱글톤은 게임이 종료되지 않는 한 계속해서 메모리를 점유하므로, 싱글톤의 남발은 메모리를 비효율적으로 사용하게 한다.
</aside>
last update : 2023-09-26