Etc

Design Pattern - singleton

SuperDT 2024. 4. 7. 20:10

Singleton Pattern은 

 

애플리케이션 내에서 특정 클래스의 인스턴스가  오직 하나만 생성되도록 보장하는 패턴입니다

 

싱글톤 패턴을 사용하면 전역에서 해당 클래스의 인스턴스에 접근 가능하고

리소스를 절약하고 객체 간의 상태를 공유할 수 있습니다

 

 

보통 패턴을 사용하지 않는 경우, 아래와 같이 클래스를 생성합니다

public class NotSingleton {
    // Singleton 패턴을 사용하지 않고 일반적인 클래스
    public NotSingleton() {}
}

 

 

패턴을 사용하는 경우는 아래와 같이

클래스 내부에서 해당 객체가 null인 경우에만 생성하고

null이 아닌 경우에는 생성된 객체를 반환하도록 클래스를 생성합니다

public class Singleton {
    private static Singleton instance;

    // 생성자를 private으로 선언하여 외부에서 인스턴스를 생성하는 것을 막음
    private Singleton() {}

    // getInstance 메서드를 통해 유일한 인스턴스를 반환
    public static Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}

 

 

두 클래스를 사용해보면

싱글톤 패턴을 사용하는 경우에는 객체 하나를 생성한 후에는 계속 해당 객체를 참조하고 있고

사용하지 않은 경우에는 생성할 때 마다 객체가 생성됩니다

public class Main {
    public static void main(String[] args) {
        // 싱글톤 패턴을 사용하는 경우
        Singleton singleton1 = Singleton.getInstance();
        Singleton singleton2 = Singleton.getInstance();
        
        System.out.println(singleton1 == singleton2); // true, 동일한 인스턴스를 참조하므로 true 출력

        // 사용하지 않는 경우
        NotSingleton notSingleton1 = new NotSingleton();
        NotSingleton notSingleton2 = new NotSingleton();
        
        System.out.println(notSingleton1 == notSingleton2); // false, 각각 다른 인스턴스를 생성했으므로 false 출력
    }
}

 

 

객체를 빈번하게 생성할 경우,

사용하지 않는 객체(사용하지 않는 참조)가 발생 메모리 누수가 발생할 수 있습니다

 

따라서 설정 정보와 같이 여러 곳에서 사용하는 클래스의 경우

싱글톤 패턴을 사용하여 메모리 누수를 막을 수 있습니다