본문 바로가기
디자인 패턴

[디자인패턴]싱글톤(Singleton)패턴

by violetoz 2013. 5. 27.

프로그램에서 단 하나의 인스턴스(Instance)만 존재하게 하고 싶을 때 사용하는 패턴입니다.
어디서든지 그 인스턴스에 접근할 수 있기 때문에 전역 변수 등을 관리할 때 상당히 편리합니다.


싱글톤 패턴의 간단한 예는 다음과 같습니다. (다만, 아래의 코드는 멀티 쓰레드 환경에서 문제가 발생합니다.)
01.public class MyClass
02.{
03.private static MyClass m_MyClass = null;
04. 
05.private MyClass() {}
06. 
07.public static MyClass getInstance()
08.{
09.if (m_MyClass == null)
10.{
11.m_MyClass = new MyClass();
12.}
13. 
14.return m_MyClass;
15.}
16.}
위와 같은 경우는 멀티 쓰레드(Multi-Thread) 환경에서는 getInstace() 메소드가 끝나기 전에
각각의 쓰레드에서 접근이 가능하기 때문에 운이 없으면 인스턴스가 여러 개 생성될 수도 있습니다.


이 경우 해결 방법은 getInstance() 메소드를 synchronized로 동기화시키는 방법이 있습니다.
01.public static synchronized MyClass getInstance()
02.{
03.if (m_MyClass == null)
04.{
05.m_MyClass = new MyClass();
06.}
07. 
08.return m_MyClass;
09.}
하지만, 함수 전체에 synchronized는 동기화 과정에서 속도 문제가 발생할 수 있습니다.


좀 더 효과적으로 하려면 함수 전체에 synchronized를 거는 것이 아니라 함수 내부의 특정 구간에만 거는 방법입니다.
01.public static MyClass getInstance()
02.{
03.if (m_MyClass == null)
04.{
05.synchronized(MyClass.class)
06.{
07.if (m_MyClass == null)
08.{
09.m_MyClass = new MyClass();
10.}
11.}
12.}
13. 
14.return m_MyClass;
15.}


그리고 코드를 좀 더 깔끔하고 쉽게 가져가기 위해서는
 아예 처음부터 인스턴스를 생성해버리는 방법입니다.
01.public class MyClass
02.{
03.private static MyClass m_MyClass = new MyClass();
04. 
05.private MyClass() {}
06. 
07.public static MyClass getInstance()
08.{
09.return m_MyClass;
10.}
11.}
이 경우는 프로그램이 처음 실행되면서 바로 인스턴스가 생겨버리기 때문에 불필요한 부분에서 인스턴스가
메모리를 차지해버린다는 단점이 있지만, 멀티 쓰레드 동기화 문제에서 자유로울 수 있고 코드가 간결해진다는
장점이 있습니다. 

그리고 어차피 한 번은 메모리에 올라갈 인스턴스이기 때문에 미리 메모리에 실어 놓는 것도 나쁘지는 않겠죠. ^^; 



'디자인 패턴' 카테고리의 다른 글

패턴의 종류  (0) 2014.09.11
디자인패턴  (0) 2014.09.11
[디자인패턴]컴포지트(Composite)패턴  (0) 2013.05.27