[Java] 싱글턴 패턴 (Singleton pattern)
싱글턴 패턴이란 프로그램 내에서 객체의 인스턴스를 딱 하나만 생성하는 소프트웨어 디자인 패턴이다.
일반적으로 new 등의 생성자를 사용해 객체를 만든다. 만들어진 객체를 인스턴스라 부르고, 인스턴스는 여러 개 생성할 수 있고 각자 객체 지향적으로 작동한다. 그러나 싱글턴 패턴으로 만들어진 클래스는 생성자를 여러 번 호출해도 최초의 생성자가 만든 객체를 리턴하게 되어, 결과적으로 객체는 하나만 존재하게 된다.
아래 코드를 보자.
class Connection {
private static Connection _inst = null;
private int count = 0;
static public Connection get() {
if(_inst == null) {
_inst = new Connection();
return _inst;
}
return _inst;
}
public void count() {
count++;
}
public int getCount() {
return count;
}
}
클래스 내부에서 인스턴스는 private static으로 선언되어 있다. 정적 변수로 선언했으므로 한번 만들어진 인스턴스는 변하지 않는다. 또한 private로 선언했으므로 클래스 외부에서 인스턴스를 만들 수 없게 한다.
get() 을 보면 인스턴스가 null일 때만 (즉 최초의 생성자가 아직 호출되지 않은 경우) 새로운 객체를 생성하고, 그렇지 않으면 이미 생성되어 있는 인스턴스를 반환한다. 이러한 구조로 여러 번 생성자가 호출되어도 계속 같은 객체 하나만을 리턴하게 된다.
public class main {
public static void main(String[] args) {
Connection conn1 = Connection.get();
conn1.count();
Connection conn2 = Connection.get();
conn2.count();
Connection conn3 = Connection.get();
conn3.count();
conn1.count();
System.out.print(conn1.getCount());
}
}
그래서 이런 식으로 계속 get()을 호출해도 인스턴스는 하나만 생성되어, count는 계속 쌓이게 되고 출력값은 4가 된다. 여러 Connection 객체를 생성한 것처럼 보이지만 사실 conn1, 2, 3 모두 같은 하나의 객체를 가리키고 있는 것이다.
근데 이거 왜 쓰냐?
: 객체가 메모리를 많이 잡아먹거나 할 때 리소스 절약을 위해서 쓴다고 한다. 하나의 데이터를 프로그램 내에서 여러 번 돌려쓸 때도 사용할 수 있을 것 같다.