프로그래밍/C#

싱글톤 (Singleton)

selinatsu 2024. 10. 14. 01:56
반응형

싱글톤(Singleton) 패턴은 특정 클래스의 인스턴스가 하나만 생성되도록 보장하는 디자인 패턴입니다.

주로 애플리케이션 전역에서 하나의 객체만 필요할 때 사용됩니다.

예를 들어, 설정 관리 클래스, 로그 관리 클래스 등에 사용될 수 있습니다.

 

C#에서 싱글톤 패턴을 구현하는 방법은 여러 가지가 있지만, 가장 일반적인 구현 방법을 예시로 설명해 드리겠습니다.

 

기본적인 싱글톤 구현

public class Singleton
{
    // 유일한 인스턴스를 저장하는 정적 필드
    private static Singleton instance = null;

    // 인스턴스에 접근하는 정적 프로퍼티
    public static Singleton Instance
    {
        get
        {
            // 인스턴스가 없으면 새로 생성
            if (instance == null)
            {
                instance = new Singleton();
            }
            return instance;
        }
    }

    // 외부에서 인스턴스를 생성하지 못하게 생성자를 private로 선언
    private Singleton()
    {
        // 초기화 작업
    }

    // 싱글톤 클래스 내부에 메서드 추가
    public void DoSomething()
    {
        Console.WriteLine("싱글톤 인스턴스에서 작업을 수행합니다.");
    }
}

 

 

사용 방법

class Program
{
    static void Main(string[] args)
    {
        // 싱글톤 인스턴스에 접근
        Singleton singleton = Singleton.Instance;

        // 메서드 호출
        singleton.DoSomething();
    }
}

 

 

스레드 안전한 싱글톤 구현 (Lazy Initialization)

위의 기본적인 구현은 여러 스레드에서 동시에 접근할 경우 문제가 발생할 수 있습니다. 이를 방지하기 위해 lock을 사용한 스레드 안전한 싱글톤 구현을 할 수 있습니다.

 

public class Singleton
{
    private static Singleton instance = null;
    private static readonly object lockObj = new object();

    public static Singleton Instance
    {
        get
        {
            // 첫 번째 접근에서만 잠금을 걸어 인스턴스 생성
            lock (lockObj)
            {
                if (instance == null)
                {
                    instance = new Singleton();
                }
                return instance;
            }
        }
    }

    private Singleton()
    {
        // 초기화 작업
    }

    public void DoSomething()
    {
        Console.WriteLine("스레드 안전한 싱글톤 인스턴스에서 작업을 수행합니다.");
    }
}

 

 

C#의 Lazy<T>를 사용한 싱글톤 구현

C#에서는 Lazy<T> 타입을 사용해 더욱 간결하게 스레드 안전한 싱글톤을 구현할 수 있습니다.

 

public class Singleton
{
    private static readonly Lazy<Singleton> lazyInstance = new Lazy<Singleton>(() => new Singleton());

    public static Singleton Instance
    {
        get
        {
            return lazyInstance.Value;
        }
    }

    private Singleton()
    {
        // 초기화 작업
    }

    public void DoSomething()
    {
        Console.WriteLine("Lazy<T>를 사용한 싱글톤 인스턴스에서 작업을 수행합니다.");
    }
}

 

사용 방법

class Program
{
    static void Main(string[] args)
    {
        Singleton singleton = Singleton.Instance;
        singleton.DoSomething();
    }
}

 

 

요약 

기본 싱글톤:

인스턴스를 하나만 생성하며, 필요할 때만 인스턴스를 생성하는 방식입니다.

 

스레드 안전한 싱글톤:

여러 스레드에서 동시에 접근해도 문제없도록 lock을 사용합니다.

 

Lazy<T> 사용:

더 간결하고 최적화된 방식으로 스레드 안전한 싱글톤을 구현할 수 있습니다.

각 방법 모두 상황에 맞게 선택해 사용하면 됩니다.

 

 

 

반응형

'프로그래밍 > C#' 카테고리의 다른 글

Lazy<T> 에 대한 조금 더 깊이있는 이해  (1) 2024.10.14
Lazy<T>  (1) 2024.10.14
static 선언  (0) 2024.10.13
event 그리고 delegate, Action  (0) 2024.10.12
Action  (0) 2024.10.12