c# 싱글톤 사용 이유 및 싱글톤 생성방법

2024. 10. 2. 14:37카테고리 없음

싱글톤을 사용하는 이유

1. 프로그램 내에서 단 하나의 인스턴스만 생성하기 위함이다.

GameManager 클래스의 경우, 게임을 관리하는 객체가 여러 개 있으면 게임 로직이 꼬이거나 문제가 발생할 수 있기 때문에 하나의 인스턴스만을 생성해서 관리하기 위함이다.

 

2. 전역에서 접근 가능하게 만들기 위함이다.

싱글톤 패턴을 사용하면 특정 클래스의 인스턴스를 어디서든 전역적으로 접근할 수 있기때문이다.

GameManager.Instance 를 통해 프로그램 내 모든 곳에서 동일한 GameManager 인스턴스에 접근할 수 있습니다.

 

싱글톤을 만드는 3가지 방법

첫번쨰 ( 싱글톤 인스턴스를 담을 상자하나 = 필드 ) ( 필드 접근제한자 private 밑 static으로 생성 )

private static GameManager _instance;

-> instance 필드를 private으로 만들어준다.

 

두번쨰 (담은상자를 어떻게 전달해줄건지 만드는 로직하나) (메서드 접근제한자 public 과 static을 생성)

인스턴스 담을 변수를 만들어 줬으면 그거를 가지고 이제 어떻게 전달해 줄건지를 만드는 로직을 만들어 줘야한다.

public static GameManager Instance
{
    get
    {
        if (_instance == null)
        {
            _instance = new GameManager();
        }
        return _instance;
    }
    private set { }
}

 

세번째 ( 생성자를 private으로 생성 )

private GameManager() { }

-> 매니저 클래스 생성자를 private으로 만들지 않으면 인스턴스가 생성되기 때문이다.

중요!!!!!!

그래서 GameManger안에서 한번만 인스턴스가 생성되게 만들어 주는 메서드를 만들어주면서 생성자를 private으로 만들어 줘야한다.

 

싱글톤 사용 예제 코드

public class GameManager
{
    private static GameManager _instance;        //첫번째 인스턴스 담을 변수 선언

    public static GameManager Instance         //두번째 그 인스턴스를 어떻게 전달해줄건지 담은 메서드
    {
        get
        {
            if (_instance == null)
            {
                _instance = new GameManager();
            }
            return _instance;
        }
        private set { }
    }

    public Creature Player { get; private set; }

    private GameManager() { }                            //세번째 생성자를 private으로 생성해주기

    public void Init(Creature player)                 //인스턴스 하나만 만드는 로직 생성
    {
        Player = player;
    }
}

 

총정리

싱글톤 패턴을 사용하는 이유는 단 하나의 인스턴스만 생성하고, 이를 전역적으로 접근 가능하게 만들기 위해서이다. 게임 관리와 같은 중요한 역할을 하는 객체가 여러 개 생기지 않도록 방지하고, 어디서든 동일한 인스턴스에 접근할 수 있도록 하기 위해 사용된다.