[디자인패턴] 생성패턴(1) - Singleton Pattern (싱클턴 패턴)

Study/Software Architecture · 2023. 5. 14. 23:02

디자인 패턴 총정리 시리즈의 제일 첫 패턴은 Singleton Pattern입니다.

사용하는 방식에 따라서 현업에서도 많이 사용했던 기억이 납니다.

 

1. 개요

싱글턴 패턴은 생성 패턴의 한 범주에 속합니다. 사용하는 주요 목적은 클래스 인스턴스화를 단일 객체로 제한해 주는 것입니다. 해당 패턴은 고유한 인스턴스에 전역 접근 권한을 부여하고 해당 인스턴스의 생성을 제어하려는 경우에 유용하게 쓰일 수 있습니다.

 

2. 예시 - Logger Class

응용 프로그램 전체에서 Logging을 처리하기 위해 Logger 클래스가 필요한 경우를 예로 들어보겠습니다.

Singleton Pattern을 사용했을 때 Logger 클래스의 인스턴스가 하나만 존재하는지 확인해보려 합니다.

 

다음은 C++ 예시입니다.

class Logger {
private:
    static Logger* instance;
    Logger() {} // Private constructor to prevent direct instantiation

public:
    static Logger* getInstance() {
        if (instance == nullptr) {
            instance = new Logger();
        }
        return instance;
    }

    void log(const std::string& message) {
        // Logging implementation goes here
        std::cout << "Log: " << message << std::endl;
    }
};

Logger* Logger::instance = nullptr; // Initialize the static instance to nullptr

위의 코드에서 직접적인 인스턴스화를 방지하기 위해 private 생성자가 있는 Logger 클래스를 정의합니다. 클래스에는 Singleton 인스턴스를 보유하는 static 멤버 변수도 포함합니다. 

getInstance() 메서드는 Singleton 인스턴스에 접근할 수 있는 방법을 제공하며, 아직 인스턴스가 생성되지 않은 경우 인스턴스를 생성합니다.

 

3. 장점

1) Global access: Singleton Pattern은 단일 인스턴스에 대한 전역 접근을 용이하게 하여 객체 전달을 쉽게 만들어 줍니다.

2) Lazy initailization: 인스턴스는 처음 요청할 때만 생성되며 필요할 때까지 리소스를 절약할 수 있습니다.

3) Thread safety: Sigleton Pattern이 올바르게 구현되면 인스턴스에 대한 thread에 안전한 접근을 보장합니다.

 

4. 단점

1) Testing complexity: 객체의 전역성에 의해 단위 테스트가 어려워질 수 있습니다. 이를 방지하기 위해선 종속성을 신경 쓰며 객체를 관리하고, 테스트 시나리오를 미리 분리하여 구조를 설계해야 합니다.

2) Potential overuse: Singleton Pattern은 코드 유지 보수를 복잡하게 만들 수 있고, 잠재적인 결합성을 증가시킬 수 있기 때문에 과도하게 사용하지 않아야 합니다.

 

5. 결론

Singleton Pattern은 단일 인스턴스를 보장하는 강력한 설계 구조를 제공하여 전역 접근과 효율적인 리소스 관리를 가능하게 해 줍니다. 프로젝트에 Singleton Pattern을 적용함으로써 객체 생성을 보다 쉽게 할 수 있고 코드 재사용성을 향상할 수 있습니다.

 

실제로 사용해 본 경험은 되게 유용한데 한번 남용해서 디버깅하기 시작하면 끝도 없이 안으로 파고들어 가야 하더라고요.... 참 유용하지만 귀찮았던 기억이 납니다!

반응형