본문 바로가기
Unity 3D

Unity C# 문법 (10) 싱글톤 패턴(Singleton)

by 연꿈술사 2023. 8. 19.

안녕하세요 연꿈술사입니다. 오늘은 싱글톤 패턴에 대해 알아보겠습니다. 처음 싱글톤 패턴을 접하면 무슨 말인지 이해가 안되는 경우가 많습니다. 보다보면 머리가 아파 안쓰려고 하게 됩니다. 하지만 이 싱글톤패턴에 대해 이해를 하고, 사용할 줄 알게 되면 더 쓰고 싶어지는 경우가 많죠. 하지만 또 너무 많이 사용하는 것도 단점이 되기도 합니다. 이 싱글톤 패턴에 대해 알아보겠습니다.

 

싱글톤 패턴은 소프트웨어 디자인 패턴 중 하나로, 어떤 클래스의 인스턴스가 시스템 내에 하나만 존재하도록 보장하며, 이를 통해 쉽게 접근해서 사용할 수 있게 하는 패턴입니다. 자주 쓰는 곳은 공유 리소스, 설정 관리, 로그 관리, 게임 내의 데이터 관리 등에서 사용 됩니다.

싱글톤은 해당 클래스의 인스턴스는 하나만 생성되도록 하며, 전역적으로 접근 가능하게 합니다. 또한 생성자는 private으로 하여 외부에서 새로운 인스턴스를 만들거나 수정하지 못하게 합니다.

 

일단 예제 코드를 보며 설명 드리겠습니다.

public class GameManager : MonoBehaviour
    {
        public static GameManager Instance { get; private set; }

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

       public int score = 0;

       public void AddScore(int amount)
       {
            score += amount;
       }
    }

static을 통해 메모리의 데이터 타입에 저장하고, Instance 라는 변수를 선언하고 수정하지 못하게 해줍니다.

이후 Instance가 null, 즉 시스템 상에 없다면 내 자신을 Instance 로 넣어줍니다. 그러면서 씬이 바뀌었을 때 자신을 파괴하지 않고 유지합니다. 하지만 Intance가 null이 아니라면 이미 Instance가 존재한다는 뜻이니 둘 이상 존재하면 안되기 때문에 자신을 삭제합니다.

 

사실 이렇게 들으면 얼마전의 저같은 초심자 입장에선 이해가 안되기도 합니다. 그냥 구현하는 방법만 알아두시고, 차차 사용해보고 자주 읽어보면서 이해를 해나가시다 보면 어느새 음 이건 싱글톤으로 하면 되겠는데? 하는 날이 생깁니다. 그 때 다시 읽어보시면 아마 이해하는 경지에 오르셨을 거라고 생각합니다. 

 

이외에 다른 클래스에서 사용할 변수나 메서드는 public으로 선언해줍니다.

이후 타 클래스에서 사용하려면

public class Enemy : MonoBehaviour
    {
        private void OnDestroy()
        {
            GameManager.Instance.AddScore(10);
        }
    }

이런식으로 쉽게 접근이 가능합니다. 게임 매니저를 통해 다양한 메서드를 구현해놓은 후, 필요한 객체에 따라 이런식으로 짧게 써주기만 한다면 관리하기가 편해지고, 문제가 생겼을 시 빠르게 확인 또한 가능합니다.

 

전역변수이기 때문에 너무 남발하지 않아야하고, 전역적으로 사용되기 때문에 테스트하기도 쉽지 않은 싱글톤 패턴이지만, 사용함에 있어서 편하기도 하고 전역적으로 필요한 메서드 들에 대해서 한 번에 관리할 수 있기 때문에 코드관리에 유용하다고 할 수 있겠습니다.

 

오늘은 싱글톤 패턴에 대해 알아보았습니다. 좀 더 이해시켜드리고 싶었는데 쉽지 않았네요.. 좀더 알아듣기 쉽게 설명할 수 있게 되면 수정해보도록 하겠습니다. 감사합니다.

댓글