싱글턴 패턴 (Singleton Pattern)
1. 싱글턴 패턴이란?
소프트웨어 디자인 패턴에서 싱글턴 패턴을 따르는 클래스는 생성자가 여러 차례 호출되더라도 실제로 생성되는 객체는 하나이고 최초 생성 이후에 호출된 생성자는 최초의 생성자가 생성한 객체를 리턴한다. 이와 같은 디자인 유형을 싱글턴 패턴이라고 한다. 주록 공통된 객체를 여러개 생성해서 사용하는 DBCP(DataBase Connection Pool)와 같은 상황에서 많이 사용된다. - 위키피디아 -
- 하나의 객체만을 생성해 그 후 호출된 곳애서는 기존에 생성했던 객체를 반환해주어 하나의 인스턴스만을 사용하게 하는 패턴이다.
- 프로그램 어디에서든 이 인스턴스에 접근할 수 있도록 하는 패턴이다.
- 생성자가 여러 차례 호출되더라도 실제로 생성되는 객체는 하나이고 최초 생성 이후에 호출된 생성자는 최초에 생성한 객체를 반환한다.
2. 사용하는 이유
- 고정된 메모리 영역을 사용하도록 단 한번만 new로 객체를 생성하기 때문에 메모리의 낭비를 줄인다.
- 전역변수로 선언되고 전역 메서드로 호출하기 때문에 다른 클래스에서의 사용이 쉽다.
3. 예제
상품을 관리하는 ProductManager 클래스를 살펴보자.
public class ProductManager {
private static ProductManager pmgr;
private ProductManager() {}
public static ProductManager getInstance() {
if (pmgr == null) {
pmgr = new ProductManager();
}
return pmgr;
}
}
- 외부에서 접근하지 못하도록 생성자를 private으로 선언한다.
- 한 번만 생성될 객체인 pmgr 변수를 만들어준다.
- 객체를 생성해 전달해주는 메서드인 public static ProductManager getInstance()를 만들어준다.
3-1. 이 때, 기본 생성자를 통해 생성할 수 없기 때문에 외부에서 해당 getInstance 메서드에 접근하려면 static 타입이어야 한다.
3-2. static 멤버는 static 멤버에만 접근 가능하기 때문에 pmgr 변수도 static으로 변경해준다.
- getInstance 메서드를 호출했을 때,
4-1. 기존에 생성된 인스턴스가 없으면 new로 인스턴스를 생성해 반환해준다.
4-2. 기존에 생성된 인스턴스가 있으면 생성되어 있던 인스턴스를 반환해준다.
4. 문제점
- 싱글턴 인스턴스가 너무 많은 일을 하거나 다른 클래스의 인스턴스들과 많은 데이터를 공유할 경우 결합도가 높아져 "개방-폐쇄 원칙"을 위배하게 된다.
- Multi-thread 환경에서 여러 스레드가 공유될 때. 조건문이 동시에 돌 수 있기 때문에 여러 개의 인스턴스가 발생할 위험이 있다.
- 멀리 하기 보다는 잘 사용하는 것이 중요하다!!