[C#] Singleton Pattern

Lingtea_luv·2025년 4월 5일
0

C#

목록 보기
26/37
post-thumbnail

Singleton


특정 클래스의 인스턴스를 하나만 생성되도록 보장하는 디자인 패턴

개념

게임이 실행되었을 때 이를 전체적으로 관리하는 게임 매니저는 반드시 하나만 존재해야한다. 만약 둘 이상 존재한다면, 어떤 게임 매니저를 따라야할지 알 수 없어 충돌이 생기기 때문이다.

이처럼 하나의 인스턴스만 보장해야할 때 사용하는 것이 싱글톤 패턴이며, 게임 개발에서 가장 많이 활용되는 패턴 중 하나이다. 게임 매니저부터 사운드 매니저 등 여러 매니저가 굉장히 많기 때문이다.

구현

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

우선 클래스를 생성하면 필드에 static으로 인스턴스를 생성한다. 이때 생성자는private으로 선언하여 외부에서 new 키워드로 새로운 인스턴스 생성을 하지 못하도록 하고, instance가 필요할 때는 프로퍼티를 public static으로 선언하여 최초에 만들어진 instance에 접근할 수 있도록 한다.

이렇게 하면 싱글톤 패턴의 구현이 끝난 것이다. 하지만 이렇게 싱글톤 패턴을 사용해야하는 클래스가 많아질수록 위의 코드를 일일이 치는 것이 비효율적이기에, 제네릭으로 만들어 이를 활용하는 것이 가능하다.

public class Singleton<T>
{
    private static T instance;
    public static T Instance
    {
        get { return instance; }
    }    
}
        
public class SoundManager : Singleton<SoundManager> { }

이렇게 싱글톤 패턴의 제네릭을 구현하면 아래처럼 상속을 통해 쉽게 싱글톤 패턴 적용이 가능하다.

장단점

장점

  1. 메모리 낭비 방지
    하나의 인스턴스만을 사용하기에 고정된 메모리 영역만 사용하여 메모리 낭비를 막을 수 있다.
  2. 싱글톤 인스턴스의 접근성
    싱글톤 클래스에서 만들어진 인스턴스는 전역 인스턴스이기에 다른 클래스에서 해당 데이터를 가져오기 쉽다.
  3. 하나의 인스턴스 보장
    인스턴스가 반드시 하나만 존재해야하는 상황에서 용이하게 사용되며, 실제로 게임 개발에서 쓰임이 많다.

단점

  1. 개방-폐쇄 원칙의 위배
    싱글톤 인스턴스가 너무 많은 일을 맡게 되면 다른 클래스와의 결합이 커져 개방-폐쇄 원칙을 위배하게된다. 즉 수정이 어려워지고 추가를 할 때 기존 코드를 건드릴 수 밖에 없다.
  2. 예외처리 필수
    위의 코드에는 예외처리를 하지 않았지만, 멀티 쓰레드 환경에서는 예외처리를 하지 않으면 인스턴스가 여러 개 생성될 수 있다.
profile
뚠뚠뚠뚠

0개의 댓글