싱글톤 패턴(Singleton Pattern)

반응형

싱글톤 패턴은 소프트웨어 디자인 패턴 중 하나로, 클래스의 인스턴스가 오직 하나만 생성되게 보장하는 패턴입니다. 일반적으로, 전역 변수를 사용해 데이터를 공유하는 경우의 문제점을 해결하며, 특정 클래스의 객체를 여러 개 생성하는 것을 방지해 자원 낭비를 최소화하는데 도움이 됩니다.

싱글톤 패턴은 다음과 같은 경우에 사용하기 적절하다고 합니다.

1. 공유 자원 관리: 여러 객체가 동일한 리소스에 대한 접근이 필요할 때 싱글톤 패턴을 사용하면 효율적으로 리소스를 관리할 수 있습니다. 예를 들어 데이터베이스 연결, 설정 파일 관리 등입니다.

2. 객체 생성 비용 절감: 객체 생성 시 많은 시간이나 자원이 소모되는 경우, 싱글톤 패턴을 사용하여 전체 프로그램에서 걸쳐 객체 생성에 필요한 자원 소모를 줄일 수 있습니다.

3. 로깅 기능 구현: 프로그램 전반에서 로그를 남기는 기능이 필요할 때, 단일 인스턴스를 통해 로깅 기능을 구현할 수 있습니다.

4. 캐시 관리: 여러 객체가 공유하여 사용하는 캐시를 관리할 때, 싱글톤 패턴을 사용하면 효율적으로 간단하게 구현할 수 있습니다.

하지만 싱글톤 패턴은 전역 상태를 갖는다는 단점이 있습니다. 이로 인해 다른 객체들과의 결합도가 높아질 수 있고, 테스트 및 유지보수가 어려워질 수 있습니다.

싱글톤 패턴을 구현하기 위한 주요한 방법은 다음과 같습니다.

Eager Initialization:

public class Singleton {
    private static final Singleton instance = new Singleton();
    
    private Singleton() {}
    
    public static Singleton getInstance() {
        return instance;
    }
}


이 경우에는 클래스가 로드될 때 싱글톤 인스턴스가 생성되므로 인스턴스 생성시 리소스가 낭비될 수 있습니다.

Lazy Initialization:

public class Singleton {
    private static Singleton instance;

    private Singleton() {}
    
    public static synchronized Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}


이 경우에는 인스턴스가 필요한 시점에 생성되기 때문에 리소스 낭비를 최소화할 수 있습니다. 그러나 동기화로 인해 성능 저하가 일어날 수 있습니다.

Double-Checked Locking(더블 체크 락킹):

public class Singleton {
    private static volatile Singleton instance;

    private Singleton() {}
    
    public static Singleton getInstance() {
        if (instance == null) {
            synchronized (Singleton.class) {
                if (instance == null) {
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}


이 방법은 성능 저하를 최소화하면서 인스턴스 생성에도 효율적입니다.

이러한 싱글톤 패턴의 구현 방법 외에도 Enum, Bill Pugh Singleton 등 다양한 방법들이 있습니다. 각 방법마다 장단점과 적절한 사용 사례가 있다고 합니다.

Designed by JB FACTORY