싱글턴 패턴(Singleton Pattern)
## 참고로 아래의 예제들은 위키피디아(http://en.wikipedia.org/wiki/Singleton_pattern)에서 참조하였습니다.
정의) 디자인 패턴의 일종으로써 오직 하나 뿐인 인스턴스(instance)를 구현하여 주는 디자인 패턴으로써 이 패턴에 대한 광역적인 접근(global access)가 가능하도록 해야 합니다.
용도) 객체 중에서 하나 만 존재하면 되는 것들(thread-pool, dialog box, cache, preference-configuration, registry-configuration, logging object, device-driver 등등)에 사용되며, 이러한 객체에서 인스턴스를 두개 이상 작성하게 되면 프로그램 구동시 시스템 자원을 불필요하게 사용하는 문제가 발생합니다. 이러한 문제를 해소하기 위해서는 위의 디자인 패턴을 사용하면 효율적입니다. 이러한 싱글턴 패턴은 이미 전문가들에 의해서 검증된 디자인 패턴으로써 전역 변수처럼 인스턴스를 어디서든지 사용할 수 있는 장점을 가지고 있습니다. 그러나 전역변수처럼 자원을 많이 사용하지 않고 꼭 필요한 만큼만을 사용하기 때문에 시스템 자원을 효율적으로 사용할 수 있는 장점이 있습니다.
# 참고로 전역 변수를 사용할 때의 단점은 프로그램이 시작할 때부터 자원을 차지하고 들어가기 때문에 간혹 자원을 불필요하게 많이 사용할 가능성이 있습니다.
# 디자인 패턴(design pattern) : 프로그램을 작성하다보면 최적화된 코드를 작성하는 것이 그리 쉬운 것이 아님을 직시하게 됩니다. 설계(디자인)시 정확한 프로그래머의 의도를 경우에 맞는 알고리듬으로 최적화하여 구현한 것을 디자인 패턴이라고 볼 수 있습니다. 대개 23개 정도의 전문가들이 주장하는 유용한 디자인 패턴들이 시중의 서적들에서 볼 수 있는 것이며 여러 부류의 객체 지향 언어로 구현됩니다. 특히 GoF(Gang of Four)의 디자인 패턴이 효시라고 볼 수 있으며 명저이기도 합니다. 사실 우리가 자바에서 사용하는 interface도 디자인 패턴을 구현한 것이라고 볼 수 있습니다.
object Example extends ArrayList {
// creates a singleton called Example
}
## 전형적인 싱글턴 구현 ##
public class Singleton {
private final static Singleton instance = new Singleton();
// Private constructor suppresses generation of a (public) default constructor
private Singleton() {}
public static Singleton getInstance() {
return instance;
}
}
## Java 5에서의 싱글턴 구현 ##
public class Singleton {
private static volatile Singleton INSTANCE;
// Private constructor suppresses generation of a (public) default constructor
private Singleton() {}
public static Singleton getInstance() {
if (INSTANCE == null)
synchronized(Singleton.class) {
if (INSTANCE == null)
INSTANCE = new Singleton();
}
return INSTANCE;
}
}
// 참고로 volatile은 멀티쓰레드(multi-thread) 환경에서 사용하는 키워드로써 “레지스터를 신뢰하지 말고 메모리에서 다시 로딩하라”라는 뜻이다. 쓰레드 환경에서 동시 접근이 언급된 부분은 이 키워드를 쓰는 것이 바람직하다. 추후의 다른 코드에서 포팅할 경우 문제를 최소화 한다.
// 다른 개발자 등이 클래스에 대한 인스턴스를 생성하지 못하도록 하기 위해 은닉성에 해당되는 private 키워드를 사용함으로써 그렇게 할 수 있으며, 좀더 확고하게는 “static”,”final” 등의 키워드를 이용하기도 합니다.
// getInstance() 메소드는 인스턴스를 생성하여 리턴하는 기능을 합니다.
// INSTANCE 에 하나 밖에 없는(유일무이한, unique) 인스턴스가 저장됨.
(정적 변수). 만약 null 값이면 인스턴스가 생성되지 않은 것으로 간주합니다. 만약 인스턴스가 생성되지 않았다면( if (INSTANCE == null) ) 인스턴스를 생성합니다( INSTANCE = new Singleton(); ).
# 싱글턴 패턴을 작성할 때 미리 만들지 말고 필요시 작성하여 생성을 지연할 수 있는데 이것을 지연 초기화(lazy-initialize)라고 합니다.
가령 아래와 같이 Factory 라는 클래스를 코딩한다고 하였을 때 다음과 같은 방법을 사용할 수 있습니다.
public static Factory getFactory()
{
if (factory == null){
factory = new Factory();
// ......
}
return factory;
}
## 또 다른 구현 사례 ##
public class Singleton { // by Bill Pugh
// Private constructor suppresses generation of a (public) default constructor
private Singleton() {}
/**
* SingletonHolder is loaded on the first execution of Singleton.getInstance()
* or the first access to SingletonHolder.instance , not before.
*/
private static class SingletonHolder {
private final static Singleton instance = new Singleton();
}
public static Singleton getInstance() {
return SingletonHolder.instance;
}
[출처] 싱글턴 패턴(Singleton Pattern)|작성자 키아
'Java' 카테고리의 다른 글
[Java] Java Tutorial (0) | 2011.02.18 |
---|---|
[Java] Java 1.4와 1.5의 Collection 다루기 (0) | 2011.02.01 |
[Java] 각종Tip모음 (0) | 2011.01.28 |
[Java] MultiPartRequest 객체(cos.jar)를 사용한 업로드 (0) | 2010.12.13 |
[Java] JasperReports (1) | 2010.12.07 |