본문 바로가기
Design Pattern

C# - 싱글톤 패턴 (Singleton Pattern) | 디자인 패턴

by Classic Master 2024. 5. 14.
728x90

싱글톤 패턴  ( Singleton Pattern )

싱글톤 패턴은 프로그래밍에서 자주 사용되는 디자인 패턴 중 하나입니다. 

이 패턴은 특정 클래스의 인스턴스가 오직 하나만 생성되고, 그 인스턴스에 대한 전역적인 접근 지점을 제공하여 여러 부분에서 쉽게 접근하고 수정할 수 있도록 돕습니다. 이것은 프로그램이 실행되는 동안에 오직 한 인스턴스만 생성되므로 데이터를 접근하고 수정하기가 매우 편리합니다. 

하지만 싱글톤 패턴을 사용할 때에는 주의해야 할 점들도 있습니다. 이 패턴은 프로그램의 구조를 단순하게 만들 수는 있지만, 과용하면 프로그램을 복잡하게 만들고 디버깅이 어려워질 수 있습니다.

싱글톤 패턴의 구현은 다음과 같습니다.

  • 생성자를 private으로 선언: 클래스의 생성자를 private으로 선언하여 외부에서 인스턴스를 직접 생성하는 것을 막습니다.
  • 정적 메서드를 통한 인스턴스 반환: 클래스 내부에 유일한 인스턴스를 담는 정적 변수를 선언하고, 이를 반환하는 정적 메서드를 구현합니다.
  • 지연 초기화(Lazy Initialization): 인스턴스가 필요한 시점에 생성되도록 합니다.

.

public class SingletonExample
{
    // 유일한 인스턴스를 저장할 정적 변수
    private static SingletonExample instance;

    // 생성자를 private으로 선언하여 외부에서 직접 인스턴스를 생성하는 것을 막음
    private SingletonExample() { }

    // 정적 메서드를 통해 유일한 인스턴스를 반환
    public static SingletonExample GetInstance()
    {
        // 인스턴스가 아직 생성되지 않았다면, 생성하고 반환
        if (instance == null)
        {
            instance = new SingletonExample();
        }
        return instance;
    }
}

위의 코드에서 GetInstance() 메서드는 SingletonExample 클래스의 유일한 인스턴스를 반환합니다. 이 메서드를 호출하여 객체에 접근하고 수정할 수 있습니다. 이렇게 하면 프로그램 전체에서 동일한 인스턴스를 사용할 수 있습니다.

반응형

싱글톤 패턴 장점 및 단점

싱글톤 패턴의 장점과 단점에 대해 더 자세히 살펴보겠습니다.

장점

  • 메모리 절약과 성능 향상 : 하나의 인스턴스만 생성되므로 메모리를 절약하고, 동일한 인스턴스를 사용하므로 성능이 향상됩니다.
  • 데이터 관리의 편리성 : 인스턴스 내의 데이터를 한 곳에서 관리할 수 있어 코드의 유지 보수가 쉬워집니다.


단점

  • 객체 의존도 증가 : 싱글톤 패턴을 사용하면 다른 객체들이 이를 의존하게 되므로, 객체 간의 의존도가 증가합니다.
  • 테스트의 어려움 : 다른 객체에 의존하므로 싱글톤 객체를 테스트하기 어려울 수 있습니다.
  • 멀티스레드 환경에서의 안정성 문제 : 멀티스레드 환경에서는 여러 스레드가 동시에 인스턴스를 생성하려고 할 수 있으므로, 이에 대한 대비가 필요합니다.

이와 같이 싱글톤 패턴은 장점과 단점을 고려하여 사용해야 합니다. 디자인 패턴의 원칙에 맞게 사용하면 프로그램을 보다 효율적으로 관리할 수 있습니다.

 


유니티에서 싱글톤 예제

using UnityEngine;

public class PlayerManager : MonoBehaviour
{
    private static PlayerManager instance;

    public static PlayerManager Instance
    {
        get
        {
            if (instance == null)
            {
                instance = new GameObject("PlayerManager").AddComponent<PlayerManager>();
            }
            return instance;
        }
    }

    private PlayerManager() { }

    public void SpawnPlayer(Vector3 position)
    {
        Debug.Log("Player spawned at position: " + position);
    }

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

이 예제는 유니티에서 플레이어 관리를 위한 PlayerManager 싱글톤 클래스를 구현한 것입니다. SingletonExample과 유사하게 인스턴스를 생성하고, 플레이어를 생성하는 SpawnPlayer 메서드를 포함하고 있습니다. Awake 메서드를 사용하여 씬 전환 시 인스턴스를 파괴하지 않도록 설정합니다.

 

728x90
반응형