디자인 패턴 [디자인패턴]싱글톤(Singleton)패턴 by violetoz 2013. 5. 27. 프로그램에서 단 하나의 인스턴스(Instance)만 존재하게 하고 싶을 때 사용하는 패턴입니다.어디서든지 그 인스턴스에 접근할 수 있기 때문에 전역 변수 등을 관리할 때 상당히 편리합니다.싱글톤 패턴의 간단한 예는 다음과 같습니다. (다만, 아래의 코드는 멀티 쓰레드 환경에서 문제가 발생합니다.)view sourceprint?01.public class MyClass02.{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로 동기화시키는 방법이 있습니다.view sourceprint?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를 거는 것이 아니라 함수 내부의 특정 구간에만 거는 방법입니다.view sourceprint?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.}그리고 코드를 좀 더 깔끔하고 쉽게 가져가기 위해서는 아예 처음부터 인스턴스를 생성해버리는 방법입니다.view sourceprint?01.public class MyClass02.{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.}이 경우는 프로그램이 처음 실행되면서 바로 인스턴스가 생겨버리기 때문에 불필요한 부분에서 인스턴스가메모리를 차지해버린다는 단점이 있지만, 멀티 쓰레드 동기화 문제에서 자유로울 수 있고 코드가 간결해진다는장점이 있습니다. 그리고 어차피 한 번은 메모리에 올라갈 인스턴스이기 때문에 미리 메모리에 실어 놓는 것도 나쁘지는 않겠죠. ^^; 출처 : http://snowbora.com/442 공유하기 게시글 관리 VioletOZ' Server Programming '디자인 패턴' 카테고리의 다른 글 패턴의 종류 (0) 2014.09.11 디자인패턴 (0) 2014.09.11 [디자인패턴]컴포지트(Composite)패턴 (0) 2013.05.27 관련글 패턴의 종류 디자인패턴 [디자인패턴]컴포지트(Composite)패턴