싱글톤(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 |