2024년 5월 31일 금요일 개발일지 / 싱글톤 패턴에 대해서

2024. 5. 31. 21:00나의 개발자 기록/본 캠프 개발 일지

2024년 5월 31일 금요일


What I did today

 

 

 

어제저녁 9시에 개인 과제를 제출함으로써 개인 프로젝트가 끝났는데요. 저는 오늘 팀 프로젝트 발제가 시작할 줄 알았는데, 내일배움캠프 측에서 오늘은 쉬어가는 느낌으로 개인 공부를 하시든, 서로 이야기를 하면서 놀든, ZEP에 접속만 해서 각자 하고 싶은 일을 하면서 지금까지의 피로를 푸는 느낌으로 시간을 보냈습니다.

 

 

오후에는 밍글데이라는 매니저님들께서 준비해 주신 각종 질문에 대해서와 퀴즈 맞추기 등등 다양한 콘텐츠로 팀 팀프로젝트나 개인 프로젝트로 인한 피로를 풀고, 각자의 사연, 이야기들을 듣는 라디오를 통해서 저녁을 먹는 등 알차고 좋은 시간이었습니다. 저도 오늘 푹 쉰 만큼 주말에 복습해야 할 거 복습하면서 다음 주에 있을 팀 프로젝트에 대비하려고 합니다.


싱글톤 패턴에 대해서

 

싱글톤 패턴이란?

 

- 싱글톤 패턴(Singleton Pattern) 클래스의 인스턴스를 하나만 생성하도록 보장하는 디자인 패턴이다.

- 유니티(Unity)에서 싱글톤 패턴을 구현하면 특정 매니저 클래스가 게임 전체에서 단 하나만 존재하도록 할 수 있다.

- 예를 들어, 게임 매니저, 오디오 매니저, 인풋 매니저 등을 싱글톤으로 구현할 수 있다.


기본 싱글톤 패턴 구현 예제

using UnityEngine;

public class GameManager : MonoBehaviour
{
    private static GameManager _instance;

    public static GameManager Instance
    {
        get
        {
            if (_instance == null)
            {
                _instance = FindObjectOfType<GameManager>();

                if (_instance == null)
                {
                    GameObject singletonObject = new GameObject();
                    _instance = singletonObject.AddComponent<GameManager>();
                    singletonObject.name = typeof(GameManager).ToString() + " (Singleton)";

                    DontDestroyOnLoad(singletonObject);
                }
            }
            return _instance;
        }
    }

    private void Awake()
    {
        if (_instance == null)
        {
            _instance = this as GameManager;
            DontDestroyOnLoad(gameObject);
        }
        else
        {
            Destroy(gameObject);
        }
    }

    // 여기에 게임 매니저의 기능들을 추가할 수 있습니다.
}

싱글톤 패턴의 주요 구성 요소 설명

 

1) 정적 인스턴스 변수

private static GameManager _instance;

 

_instance 변수는 GameManager 클래스의 유일한 인스턴스를 저장한다. 정적 변수이기 때문에 클래스의 모든 인스턴스가 이 변수를 공유한다.


2) 정적 인스턴스 속성

public static GameManager Instance
{
    get
    {
        if (_instance == null)
        {
            _instance = FindObjectOfType<GameManager>();

            if (_instance == null)
            {
                GameObject singletonObject = new GameObject();
                _instance = singletonObject.AddComponent<GameManager>();
                singletonObject.name = typeof(GameManager).ToString() + " (Singleton)";

                DontDestroyOnLoad(singletonObject);
            }
        }
        return _instance;
    }
}

 

Instance 속성은 싱글톤 인스턴스를 반환한다. 인스턴스가 아직 생성되지 않았다면 FindObjectOfType 메서드를 사용하여 씬에 있는 GameManager 오브젝트를 찾는다. 만약 씬에 GameManager 오브젝트가 없다면 새로 생성하고, DontDestroyOnLoad 메서드를 호출하여 씬이 전환될 때 파괴되지 않도록 한다.


3) Awake 메서드

private void Awake()
{
    if (_instance == null)
    {
        _instance = this as GameManager;
        DontDestroyOnLoad(gameObject);
    }
    else
    {
        Destroy(gameObject);
    }
}

 

Awake 메서드는 유니티의 생명 주기 함수 중 하나로, 오브젝트가 활성화될 때 호출된다. 여기서는 _instance 변수가 설정되지 않았을 때 현재 인스턴스를 _instance 변수에 할당하고, 씬이 전환되어도 파괴되지 않도록 한다. 이미 _instance 변수가 설정되어 있다면 현재 오브젝트를 파괴한다. 이를 통해 오브젝트가 두 번 생성되는 것을 방지한다.