공부

[Java] 싱글턴 패턴 (Singleton pattern)

avocado8 2025. 4. 8. 15:10

 

 

싱글턴 패턴이란 프로그램 내에서 객체의 인스턴스를 딱 하나만 생성하는 소프트웨어 디자인 패턴이다.

일반적으로 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 모두 같은 하나의 객체를 가리키고 있는 것이다.

 

근데 이거 왜 쓰냐?

: 객체가 메모리를 많이 잡아먹거나 할 때 리소스 절약을 위해서 쓴다고 한다. 하나의 데이터를 프로그램 내에서 여러 번 돌려쓸 때도 사용할 수 있을 것 같다.