싱글톤 패턴 ( Singleton Pattern )
싱글톤 패턴이란, 인스턴스가 프로그램 내에서 오직 하나만 생성되는 것을 보장하고, 프로그램 어디에서든 이 인스턴스에 접근할 수 있도록 하는 패턴입니다.
즉, 인스턴스가 사용될 때 똑같은 인스턴스를 여러 개 만드는 것이 아니라, 기존에 생성했던 동일한 인스턴스를 사용하게끔 하는 것입니다.
싱글톤 패턴은 개념도 간단하고 구현도 간단한 편입니다.
public class SingleObj {
private static SingleObj singleObj = null;
// 외부에서 직접 생성하지 못하도록 private 선언
private SingleObj(){ }
// 오직 1개의 객체만 생성
public static SingleObj getInstance(){
if( singleObj == null ){
singleObj = new SingleObj();
}
return singleObj;
}
}
먼저 외부에서 객체를 생성할 수 없도록 생성자를 private으로 선언합니다.
즉, 객체 생성에 대한 관리를 내부적으로 하겠다는 의미이죠.
그러면 외부에서 SingleObj 객체를 생성할 수 없으므로, 미리 생성된 자신을 반환할 수 있도록 getInstance() 메서드를 정의합니다.
주의해야 할 것은 static으로 정의가 되었다는 점입니다.
생성자를 private으로 선언했기 때문에 객체를 생성할 수 없으므로, getInstacne() 메서드가 클래스에 정의되도록 static 제어자를 사용했습니다.
getInstance() 메서드를 호출했을 때,
- singleObj 변수에 객체가 할당되지 않으면( == null ) 새로운 객체를 생성하고,
- singleObj 변수에 객체가 이미 있으면 그것을 그대로 반환합니다.
정말로 하나의 인스턴스를 호출하는지 확인해보도록 하겠습니다.
public class Client {
public static void main(String args[]){
for( int i = 0; i < 5; i++ ){
SingleObj obj = SingleObj.getInstance();
System.out.println(obj.toString());
}
}
}
반복문을 돌면서 객체를 가져오도록 했는데, 모두 같은 객체임을 확인했습니다.
이상으로 싱글톤 패턴에 대해 알아보았습니다.
싱글톤 패턴을 검색해보면 많은 포스트에서 JVM을 특성을 이용하는 방식 또는 Java 언어에 특화된 방식으로 싱글톤을 구현하는 방법을 소개하고 있고,
또 다중 쓰레드 환경에서 싱글톤을 처리하는 방법 등을 소개하고 있습니다.
이 글에서는 싱글톤 자체에 대한 이해를 목표로 했기 때문에, 간단하게 글을 마쳤습니다.
그리고 다른 언어에서는 싱글톤을 어떻게 구현하고 있는지 참고하면 좋을 것 같아 링크를 남깁니다.
1) Python ( 링크 )
2) PHP ( 링크 )
3) JS ( 링크 )
또 Java에서도 여러 디자인 패턴을 사용하고 있는데 Singleton 패턴을 사용하고 있는 API는 다음과 같으며, 참고하시면 좋을 것 같습니다. ( 참고링크 )