C# Singleton

카테고리 없음 2018. 12. 29. 22:13

싱글턴


클래스를 하나의 인스턴스로 제한하고 글로벌한 액세스 지점을 제공하는 패턴




Sample Code

이 코드는 간략한 로직을 설명하기 위한 코드이고 구글링을 해보면 각 언어에 맞게 더 좋은 코드들이 많이 존재함



class Singleton
{
    private static object syncLock = new object();
    private static Singleton instance = null;
    public static Singleton Instance
    {
        get
        {
            if (instance == null)
            {
                lock (syncLock)
                {
                     if(instance == null)
                         instance = new Singleton();
                }
            }
            return instance;
        }
    }

    protected Singleton()
    {
    }

    public void Method()
    {
    }
}

public static void Main()
{
    Singleton.Instance.Method();
}


- instance를 하나만 사용하기 위해 싱글턴에 접근할 때 static으로 선언된 필드로 접근한다

- lazy initiallization : 사용되지 않을 때에는 instance를 생성하지 않았다가 필요로 할 때 생성한다

- 멀티쓰레드 환경에서도 작동하기 위해 instance에 접근할 때 lock 사용



cf) http://csharpindepth.com/articles/general/singleton.aspx 이 블로그에서 C#에서의 싱글턴에 대한 상세한 내용(.Net 4버전 이후 포함)을 담고있다. 아주 좋은 글





싱글턴의 장점


- 프로그램에서 한개의 인스턴스만 존재하도록 보장

- 전역적으로 접근 가능

- lazy initiallization을 통해 메모리 최적화





싱글턴의 단점


- 결국 전역변수! 싱글턴으로 제작한 코드를 수정해야할 경우 프로젝트 전체를 뒤져봐야함 => 로직 간 커플링이 생길 확률 높음

- 싱글턴에서 다른 객체의 레퍼런스를 참조하고 있다면 그 객체는 메모리에 계속 올라와 있을 확률이 있다

- 만약 알맞지 않은 곳에서 싱글턴을 사용해서 싱글턴이 메모리에서 내려와야할 때 어떤 클래스의 소멸자에서 싱글턴을 다시 호출하는 경우 다시 메모리에 올라옴

- 객체지향설계원칙 중 '개방-폐쇄 원칙'을 위배

- 멀티쓰레드 환경에서 동기화처리를 잘 해야한다



=> 싱글턴으로 인해 디버깅이 힘들어지고 로직 간 커플링이 생기고 메모리 관리가 어려워지는 경우가 생기기 때문에 꼭 필요한 경우에만 사용하자(리소스로딩, 통신모듈, 로깅, 캐시, 쓰레드풀 등등)


=> 개인적인 생각으로는 C#에서는 싱글턴 로직을 구현하는 것보다 static class를 활용하는 것이 더 좋아보인다

Posted by @히테
,