반응형

C# 싱글톤 패턴 : 동적 싱글톤

사용 목적

 하나만 있어야 하는 경우 사용되는 패턴이다. 보통 매니져 형태로 사용되는 경우에 사용된다. 간단하면서 의외로 자주 사용되는 패턴이기도 하다.

 하지만 최근에 멀티 쓰래딩을 구현할 경우 주의가 필요한 패턴이다. 보통 뮤텍스(크리티컬 섹션)와 같은 lock 기능을 통해서 동시에 접근하는 것을 막기도 하는데, 이런일이 잦을 수록 성능 향상을 저해 한다는 점도 있다.


싱글톤을 위한 기본 상식

 싱글톤(Singleton)이라는 단어에서 알 수 있듯이 하나만 존재하는 객체를 의미한다. 그래서 클래스라는 틀로 찍힌 인스턴스(실제 객체)는 하나만 존재 해야 한다.


 이 처럼 하나만 갖게 되어야 하는 조건을 충족 시키기 위해서 다음 조건들을 충족 해야 한다

 1. 생성자를 외부에서 접근되어서는 안된다(하나만 있어야 하기 때문)

 2. 인스턴스(실제 객체)는 하나만 있어야 한다.


 특히 1번의 조건을 충족하기 위해서 대부분 클래스를 지원하는 언어에서는 생성자를 private 혹은 protected 로 정의하여 외부에서 접근을 못하도록 막는 패턴을 갖게 된다.

 2번의 조건을 충족시키기 위해서는 내부에 인스턴스를 갖고 있되 접근이 가능하도록 해야 한다. 따라서 이를 위해 static으로 선언을 하게 된다. 이렇게 선언된 변수 혹은 객체는 해당 클래스를 통해서만 접근이 가능하게 된다. 그와 동시에 글로벌 영역에 객체가 존재하게 된다.

 그리고 마지막으로 싱글톤을 사용할 수 있도록 Instance 메서드를 만든다. C++의 경우 GetInstance()로 선언하는것이 관용적이지만, C#에서는 프로퍼티 기능이 있기 때문에 Get 관용구를 생략하는 경우가 있다.


구현 방법

동적 싱글톤 패턴 이기 때문에 인스턴스를 요청할때 없는 경우 생성해서 인스턴스를 반환하게 구현하면 된다.

예시)

using System;
public class Singleton
{
    private static Singleton _instance;
    private Singleton() {}
    public static Singleton Instance
    {
        get
        {
            if(_instance == null)
            {
                _instance = new Singleton();
            }
            return _instance;
        }
    }
}




위는 정석적인 방법이고 편의상 ? 연산을 이용하여 한줄로 선언할 수 있다. 이러한 방법은 코드를 간결하게 하지만, lock을 이용한 크리티컬 섹션을 설정할 수 없는 단점이 있다.

예시)

using System;
public class Singleton
{
    private static Singleton _instance;
    private Singleton() {}
    public static Singleton Instance
    {
        get
        {
            return (null == _instance) ? _instance = new Singleton() : _instance;
        }
    }
}




참조 자료

MSDN 싱글톤 패턴 문서



반응형

+ Recent posts