디자인 패턴
[디자인패턴]싱글톤(Singleton)패턴
violetoz
2013. 5. 27. 20:15
프로그램에서 단 하나의 인스턴스(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.
}
이 경우는 프로그램이 처음 실행되면서 바로 인스턴스가 생겨버리기 때문에 불필요한 부분에서 인스턴스가메모리를 차지해버린다는 단점이 있지만, 멀티 쓰레드 동기화 문제에서 자유로울 수 있고 코드가 간결
해진다는장점이 있습니다. 그리고 어차피 한 번은 메모리에 올라갈 인스턴스이기 때문에 미리 메모리에 실어 놓는 것도 나쁘지는 않겠죠. ^^;