프로그램을 실행할 때 보통 많은 인스턴스가 생성된다.
예를 들어 java.lang.String 클래스의 인스턴스는 문자열 1개에 대해서 1개가 생성되기 때문에 문자열 1,000 개 등장하면 1,000 개의 인스턴스가 만들어 진다.
그러나 '클래스의 인스턴스가 단 하나만 필요' 한 경우도 있다.
물론 주의를 기울여 new MyClass() 가 1회만 실행되도록 작성하면 된다. 그러나 '프로그래머가 주의를 기울여서 1개만 생성되는 것' 이 아니라
- 지정한 클래스의 인스턴스가 절대로 1개밖에 존재하지 않는 것을 보증 하고 싶을 때
- 인스턴스가 1개밖에 존재하지 않는 것을 프로그램 상에서 표현하고 싶을 때
우리는 Singleton 패턴을 사용한다.
Singleton class를 만들어 보자.
public class Singleton { private static Singleton sin = new Singleton(); private Singtone() { System.out.println("인스턴스를 생성 완료"); } public static Singleton getInstance() { return sn; } } |
test
public class Main { public static void main(String args[]) { System.out.println("start"); Singleton obj1 = Singleton.getInstance(); Singleton obj2 = Singleton.getInstance(); if ( obj1 == obj2 ) { System.out.println("obj1 과 obj2 는 같은 인스턴스"); } else { System.out.println("obj1 과 obj2 는 다른 인스턴스"); } System.out.println("End"); } } |
인스턴스의 수를 왜 제한하는 것일까?
- 복수의 인스턴스가 존재하면 인스턴스들이 서로 영향을 미치고, 뜻하지 않은 버그가 발생할 가능성이 있다. 그러나 인스턴스가 1개밖에 없다라는 보증이 있으면 그 전제조건 아래에서 프로그래밍 할 수 있다.
아래의 Singleton 클래스는 엄밀하게 말하면 Singleton pattern 이 아니다. 왜일까? (생각해 보세요)
public class Singleton { private static Singleton sin = null; private Singtone() { System.out.println("인스턴스를 생성 완료"); } public static Singleton getInstance() { if ( sin == null ) { sin = new Singleton(); } return sin; } } |