개발지식

싱글톤 패턴(Singleton Pattern)이란

우루쾅 2024. 2. 23. 23:13
728x90
반응형
SMALL

예전 기술 면접을 볼 때 싱글톤 패턴 관련해서 질문을 받았었습니다 ㅎㅎ

공부 중 이전 면접 기억이 나서 한번 정리해보겠습니다!

 

싱글톤 패턴이란

어떤 클래스가 최초 한 번만 메모리를 할당(static)하고 해당 메모리에 인스턴스를 만들어 사용하는 패턴

즉, 싱글톤 패턴은 '하나'의 인스턴스만 생성하여 사용하는 디자인 패턴입니다.

 

쉽게 말하자면 메모리 절약을 위해,

인스턴스가 필요할 때 똑같은 인스턴스를 새로 만들지 않고 기존의 인스턴스를 가져와 활용하는 기법입니다!

 

왜 사용하나요

객체는 생성할 때마다 메모리 영역을 새로 할당 받아야 합니다.

동일한 객체를 사용해야하는 경우 선언된 객체를 호출할 때마다 객체가 새로 생성이 되는데 만약 트래픽이 초당 100이 나오면 초당 100개의 객체가 생성되고 소멸되며 이는 메모리 낭비가 됩니다.

 

이를 방지하기 위해 사용되고 설계된 것이 싱글톤 입니다!

 

 

싱글톤 패턴 구현 원리

싱글톤으로 이용할 클래스를 외부에서 마구잡이로 new 생성자를 통해 인스턴스화 하는 것을 제한하기 위해 클래스 생성자 메서드에 private 키워드를 붙여줍니다! (외부에서 클래스의 멤버 변수에 직접 접근하는 것을 제한)

 

싱글톤 패턴은 객체가 프로그램에서 단 한번만 생성되도록 보장하는 디자인 패턴이기 때문에 때때로 전역 변수와 비교되기도 하지만, 싱글톤은 프로그램 내에서 하나의 인스턴스만 존재하도록 보장하며, 이를 통해 자원을 공유할 수 있습니다.

 

위 방식 외에도 Lazy Initialization 기법, Eager Initialization 기법 등등 다양한 종류들이 있지만 Initialization-on-demand holder idiom 기법의 예시를 통해 싱글톤 패턴에 대해서 확인해보겠습니다.

아래 소스코드는 Initialization-on-demand holder idiom 기법을 활용한 싱글톤 패턴 소스코드 예시입니다.

public class Singleton {
    private Singleton() {
        // 다른 곳에서 이 클래스를 인스턴스화 하는 것을 방지하기 위한 private 생성자
    }

    // 중첩된 정적 클래스
    private static class Holder {
        private static final Singleton INSTANCE = new Singleton();
    }

    // 전역 접근 지점
    public static Singleton getInstance() {
        return Holder.INSTANCE;
    }
}

 

위 소스코드에 대해 설명을 붙히자면

① Singleton 클래스의 생성자는 private로 선언되어있어 외부에서 인스턴스를 생성하는 것을 막습니다.

 

② Holder 라는 내부 정적 클래스가 싱글톤 인스턴스를 가지고 있습니다. 이 클래스는 getInstance() 메서드가 호출되기 전까지 초기화되지 않으므로, 싱글톤 인스턴스 생성이 필요할 때까지 인스턴스 생성을 늦출 수 있습니다.('Lazy Initialization')

 

③ getInstance() 메서드는 전역 접근 지점으로, 이 메서드를 통해 싱글톤 인스턴스를 얻을 수 있습니다. 이 메서드가 호출되면 Holder 클래스가 JVM 에 의해 로드되며, 이 때 싱글톤 인스턴스가 생성됩니다. JVM의 클래스 로더는 클래스를 로드하고 초기화할 때 스레드 안전성을 보장하므로, 별도의 동기화 처리 없이도 멀티스레딩 환경에서 안전하게 싱글톤 인스턴스를 사용할 수 있습니다.

 

 

정리하자면

싱글톤을 사용하지 않을 경우 선언된 객체를 호출할 때마다 객체가 새로 생성되는데, 트래픽이 초당 100이 나오면 초당 100개의 객체가 생성되고 소멸되며 이는 메모리 낭비로 이어지게 됩니다.

이를 방지하기 위해 사용되고 설계된 것이 싱글톤입니다!

 

 

 

출처

Inpa Dev 👨‍💻 싱글톤(Singleton) 패턴 - 꼼꼼하게 알아보자

개발자 소돌이 - https://babbab2.tistory.com/66

Tech Interview - https://gyoogle.dev/blog/design-pattern/Singleton%20Pattern.html

728x90
반응형
LIST