싱글턴
클래스를 하나의 인스턴스로 제한하고 글로벌한 액세스 지점을 제공하는 패턴
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를 활용하는 것이 더 좋아보인다