C++ 공부

C++ 기초_디자인패턴_싱글톤 패턴

Client Side 2025. 9. 5. 11:23

1. 싱글톤 패턴이란

특정 클래스의 인스턴스가 프로그램 내에서 단 하나만 존재하도록 보장하는 디자인 패턴.

같은 종류의 객체가 오직 하나만 생성되도록 제한하고, 이 객체에 대한 전역적인 접근점을 제공한다.

 

2. 싱글톤 패턴의 특징

2-1. 단일 인스턴스 : 클래스의 인스턴스가 프로그램 내에서 단 하나만 존재한다.

2-2. 전역 접근성 : 어디서든 이 인스턴스에 접근할 수 있는 방법을 제공한다.

2-3. 지연 초기화 : 대부분의 싱글톤은 처음 요청될 때만 초기화된다. (필요할 때만 생성)

 

3. 싱글톤 패턴의 구현 방법

싱글톤 패턴을 C++로 구현하기 위해서는 다음과 같은 핵심요소가 필요하다.

 

3-1. private 생성자 : 외부에서 new 연산자로 객체를 생성하지 못하도록 한다.

3-2. static 인스턴스 : 클래스 내부에 유일한 인스턴스를 static으로 선언한다.

3-3. static 접근 메소드 : 인스턴스에 접근할 수 있는 public 메소드 (보통 getInstance라는 이름을 사용)

3-4. static : 이 키워드는 메모리에 딱 한 번만 할당되는 특별한 변수를 만들 때 쓰는 키워드. 일반 변수와 다르게 프로그램이 실행되는 동안 계속 유지되며, 모든 객체가 이 변수를 공유해서 사용할 수 있다.

 

 

※ 기본적인 싱글톤 구현 예시

class Singleton {
private:
    // private 생성자
    Singleton() {
        // 초기화 코드
    }
    
    // 복사 생성자와 할당 연산자를 private으로 선언하여 복제 방지
    Singleton(const Singleton&) = delete;
    Singleton& operator=(const Singleton&) = delete;
    
    // 유일한 인스턴스를 저장할 static 변수
    static Singleton* instance;
    
public:
    // 인스턴스에 접근하는 static 메소드
    static Singleton* getInstance() {
        // 인스턴스가 없으면 생성 (지연 초기화)
        if (instance == nullptr) {
            instance = new Singleton();
        }
        return instance;
    }
    
    // 싱글톤의 기능 메소드
    void someFunction() {
        // 기능 구현
    }
    
    // 소멸자
    ~Singleton() {
        // 정리 코드
    }
};

// static 멤버 변수 초기화
Singleton* Singleton::instance = nullptr;

 

4. 싱글톤 패턴의 장점

4-1. 인스턴스 하나 보장 : 클래스가 하나의 인스턴스만 갖는다는 것을 확실히 알 수 있음

4-2. 전역 접근점 : 인스턴스에 대한 전역 접근 지점을 얻을 수 있음

4-3. 초기화 지연 : 해당 객체는 처음 요청될 때만 초기화 됨 (리소스절약)

 

5. 싱글톤 패턴의 단점

5-1. 단일 책임 원칙 위반 : 객체 생성과 비즈니스 로직을 동시에 관리하므로 단일 책임 원칙을 위반함

5-2. 디자인 문제 은폐 : 잘못된 디자인을 가릴 수 있음

5-3. 멀티스레드 환경 문제 : 다중 스레드 환경에서 여러 스레드가 동시에 싱글톤 객체를 생성하지 않도록 추가 처리 필요

5-4. 테스트 어려움 : 단위 테스트가 어려울 수 있음

 

6. 싱글톤 패턴의 실제 사용 사례

6-1. 설정 관리자 : 애플리케이션 설정을 관리하는 클래스

6-2. 데이터베이스 연결 관리 : DB 연결을 한 번만 초기화하고 공유

6-3. 로깅 시스템 : 로그 파일을 여러 곳에서 동시에 쓰는 것을 관리

6-4. 하드웨어 인터페이스 접근 : 프린터나 그래픽 카드 같은 하드웨어

 

 

 

< 싱글톤 패턴 기초 연습문제 >


문제:
우리가 만들 프로그램에 "로그(Log) 기록기" 기능이 필요하다. 이 로그 기록기는 프로그램 전체에서 단 하나만 존재해야 하고, 어떤 곳에서든 로그 메시지를 기록할 수 있어야 한다.

요구사항:
Logger라는 이름의 클래스를 만든다.
이 Logger 클래스가 싱글톤 패턴을 따르도록 구현한다.
Logger 클래스 안에 logMessage(const std::string& message)라는 public 함수를 만들어서, 이 함수가 호출되면 전달받은 message를 콘솔에 출력하도록 한다. (예: [로그] 메시지 내용)
main 함수에서 Logger의 인스턴스를 두 번 얻어와서, 각각 다른 메시지를 기록해본다. 그리고 두 인스턴스가 정말 같은 인스턴스인지 확인하는 코드도 넣어준다.