SeouliteLab

[Java/자바] 싱글톤(Singleton) 패턴 구현하기 본문

프로그래밍

[Java/자바] 싱글톤(Singleton) 패턴 구현하기

Seoulite Lab 2024. 3. 7. 09:07

싱글톤 패턴은 애플리케이션 전역에서 단일 인스턴스를 유지하고 해당 인스턴스에 대한 전역 접근을 제공하는 디자인 패턴입니다. Java에서는 다양한 방법으로 싱글톤을 구현할 수 있습니다. 아래에서는 여러 가지 방법으로 싱글톤을 구현하는 예제를 살펴보겠습니다.

예제 1: Eager Initialization 방식의 싱글톤

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

    private Singleton() {}

    public static Singleton getInstance() {
        return instance;
    }
}

위 예제는 Eager Initialization 방식으로 싱글톤을 구현한 것입니다. 정적 변수로 인스턴스를 미리 생성하여 getInstance() 메서드에서 반환합니다.

예제 2: Lazy Initialization 방식의 싱글톤

public class Singleton {
    private static Singleton instance;

    private Singleton() {}

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

위 예제는 Lazy Initialization 방식으로 싱글톤을 구현한 것입니다. getInstance() 메서드에서 인스턴스를 처음 요청할 때 생성합니다.

예제 3: 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;
    }
}

위 예제는 Double-Checked Locking 방식으로 싱글톤을 구현한 것입니다. getInstance() 메서드에서 인스턴스를 생성하기 전에 두 번의 null 체크를 수행합니다.

예제 4: Initialization on Demand Holder(IoDH) 방식의 싱글톤

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

    private Singleton() {}

    public static Singleton getInstance() {
        return SingletonHolder.instance;
    }
}

위 예제는 Initialization on Demand Holder(IoDH) 방식으로 싱글톤을 구현한 것입니다. 내부 정적 클래스에 인스턴스를 미리 생성하고 getInstance() 메서드에서 반환합니다.

예제 5: Enum 방식의 싱글톤

public enum Singleton {
    INSTANCE;
    
    // 다른 멤버나 메서드를 추가할 수 있음
}

위 예제는 Enum 방식으로 싱글톤을 구현한 것입니다. Java에서는 Enum 타입이 적합한 싱글톤을 구현하는 데 사용될 수 있습니다.