싱글톤 패턴이란?
싱글톤(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로 출력됩니다. 이는 fromFacebook과 fromTwitter가 동일한 인스턴스를 참조하고 있음을 의미합니다.
참고: 스레드 안전성(Thread Safety)
위 예제의 기본 구현은 단일 스레드 환경에서는 잘 동작하지만, 멀티스레드 환경에서는 두 스레드가 동시에 null 검사를 통과하여 인스턴스가 두 번 생성될 위험이 있습니다. 이 경우 C#의 Lazy<T> 타입이나 lock 문을 활용하면 스레드로부터 안전한(thread-safe) 싱글톤을 손쉽게 구현할 수 있습니다.