Computer >> 컴퓨터 >  >> 프로그래밍 >> C#

C# 싱글톤(Singleton) 디자인 패턴 구현 방법 완벽 가이드

싱글톤 패턴이란?

싱글톤(Singleton) 패턴은 생성(Creational) 유형의 디자인 패턴에 속합니다. 이 패턴은 특정 클래스의 객체가 단 하나만 인스턴스화되도록 보장해야 할 때 사용됩니다. 생성된 단일 인스턴스는 애플리케이션 전반에서 발생하는 동작들을 조율하는 역할을 담당합니다.

예를 들어 데이터베이스 연결 관리자, 로깅(Logger) 서비스, 설정(Configuration) 관리자처럼 애플리케이션 전체에서 공유되어야 하는 리소스를 다룰 때 싱글톤 패턴이 널리 활용됩니다.

구현 지침

싱글톤 패턴을 올바르게 구현하려면 다음 두 가지 원칙을 반드시 지켜야 합니다.

  • 클래스의 모든 생성자를 private으로 선언하여 외부에서 임의로 객체를 생성하지 못하도록 하고, 클래스의 인스턴스가 오직 하나만 존재하도록 보장합니다.
  • 객체의 단일 인스턴스를 반환하는 static 정적 속성(또는 메서드)을 제공하여 싱글톤 인스턴스에 대한 접근을 통제합니다.

구현 예제

아래 예제 코드의 핵심 요소는 다음과 같습니다.

  • sealed 키워드: 클래스가 상속되는 것을 차단하여 파생 클래스를 통한 객체 인스턴스화를 제한합니다.
  • null로 초기화된 private 정적 필드: null 조건 검사를 기반으로 객체의 인스턴스가 한 번만 생성되도록 보장합니다.
  • private 생성자: 클래스 자기 자신 내부가 아닌 곳에서는 객체가 인스턴스화되지 않도록 막습니다.
  • public 메서드: 싱글톤 인스턴스를 통해 호출할 수 있는 기능을 제공합니다.
public sealed class Singleton {
    private static int counter = 0;
    private static Singleton instance = null;
    public static Singleton GetInstance {
        get {
            if (instance == null)
                instance = new Singleton();
            return instance;
        }
    }
    private Singleton() {
        counter++;
        Console.WriteLine("Counter Value " + counter.ToString());
    }
    public void PrintDetails(string message) {
        Console.WriteLine(message);
    }
}
class Program {
    static void Main() {
        Singleton fromFacebook = Singleton.GetInstance;
        fromFacebook.PrintDetails("From Facebook");
        Singleton fromTwitter = Singleton.GetInstance;
        fromTwitter.PrintDetails("From Twitter");
        Console.ReadLine();
    }
}

실행 결과

Counter Value 1
From Facebook
From Twitter

실행 결과를 보면 GetInstance 속성을 여러 번 호출했음에도 불구하고 생성자가 단 한 번만 실행되어 카운터 값이 1로 출력됩니다. 이는 fromFacebookfromTwitter가 동일한 인스턴스를 참조하고 있음을 의미합니다.

참고: 스레드 안전성(Thread Safety)

위 예제의 기본 구현은 단일 스레드 환경에서는 잘 동작하지만, 멀티스레드 환경에서는 두 스레드가 동시에 null 검사를 통과하여 인스턴스가 두 번 생성될 위험이 있습니다. 이 경우 C#의 Lazy<T> 타입이나 lock 문을 활용하면 스레드로부터 안전한(thread-safe) 싱글톤을 손쉽게 구현할 수 있습니다.