Singleton
유니티에서 자주 쓰이는 singleton 패턴
객체를 하나만 생성, 생성된 객체는 어디서든 참조가 가능하다.
시스템에서 전역으로 관리가 되고, 단 하나의 클래스에서만 정보가 유지되는것을 원할 때 사용한다(ex. manager)
싱글톤의 장.단점
모든 데이터를 전역으로 관리할 수 있기 때문에 쉽게 접근이 가능하며, 중복 생성 및 메모리 낭비를 방지할 수 있으나,
정적 메모리에 할당된 객체이므로 너무 큰 메모리가 쌓일 경우 프로그램 성능이 낮아진다.
너무 많은 데이터를 공유시킬 경우 싱글톤 인스턴스와 다른 클래스 인스턴스들 간의 결합도가 높아져, 개방 폐쇄 원칙에 위배될 수 있다.
병렬처리나 동기화 같이 여러 방법으로 메모리에 접근하는데 문제가 발생하나 Synchronized키워드를 이용해 방지가 가능하다.=>멀티쓰레드 환경에서는 좋지 않다.
Singleton에 Synchronized함수가 많을수록 멀티쓰레드는 병목현상(전체 시스템의 성능이나 용량이 하나의 구성 요소로 인해 제한을 받는 현상)을 겪게 되므로 Singleton을 만나며 single thread로 동작을 한다.(지연이 발생)
예시 코드
하나의 인스턴스만을 생성하며, getInstance()를 통해 모든 클라이언트에게 동일한 인스턴스를 반환
using UnityEngine;
public class Singleton<T> : MonoBehaviour where T : Singleton<T>
{
private static T g_Instance = default(T);
public static T Inst
{
get
{
if (g_Instance == null)
{
T t = GameObject.FindObjectOfType(typeof(T)) as T;
if (t == null)
{
string strName = typeof(T).ToString();
GameObject go = new GameObject(string.Format("[{0}]", strName));
g_Instance = go.AddComponent<T>();
}
else
{
g_Instance = t;
}
}
return g_Instance;
}
}
private void OnDestroy()
{
if (g_Instance != null)
Destroy(g_Instance);
g_Instance = null;
}
}
위와같이 코드를 생성하면 singletone을 상속받은 object가 예를 들어 SceneStart가 있다면
SceneStart.Inst.함수명();
위와 같이 호출할 수 있다.
Static class VS Singleton
기본적으로 singleton 패턴은 객체를 생성함에 있어서 이 객체의 개수를 하나로 제한하겠다는 것인반면 static class는 객체 자체가 아니다.
singleton은 인터페이스 구현이 가능하고 일반 객체로서 다른 클래스나 메서드에 전달할 수 있지만 static class는 객체가 아니기에 불가능하다
'개발일지 > Unity 3D&C#' 카테고리의 다른 글
[C#] 반복문 - foreach / for / while (0) | 2022.06.30 |
---|---|
[C#] 람다식, 람다 문(Lambda) (0) | 2022.06.24 |
[C#] 델리게이트(delegate) - Func, Action, Predicate (0) | 2022.06.24 |
[C#] 델리게이트(delegate) - 델리게이트, 콜백 사용 방법 및 사용 이유 (1) | 2022.06.16 |
[UNITY] 코루틴이란? (0) | 2022.06.07 |
댓글