싱글톤 패턴 : 

싱글톤 패턴은 애플리케이션에서 클래스의 인스턴스를 단 하나만 생성하고, 이를 전역적으로 접근할 수 있도록 보장하는 디자인 패턴입니다.

예를들어서 언리얼엔진에서 로그를 남기는 것을 예로 들겠습니다. 로그를 남길 수 있는 인스턴스는 프로그램에 하나만 존재하고,  어디서든 접근 가능해야합니다 !

 

#include <iostream>
#include <fstream>
#include <string>

class LogManager { 
private:
    // 정적 멤버 변수로 싱글톤 인스턴스를 저장
    // 전체에서 하나만 관리하는 것이기 때문에!
    static LogManager* instance;

    std::ofstream logFile; // 로그를 기록할 파일 
    
    // 외부에서 인스턴스 생성 불가 =>private
    LogManager() {
        logFile.open("log.txt", std::ios::app); // 로그 파일 열기 (append 모드)
        //append 모드란 ? 파일을 열어서 맨 마지막에 추가되는 모드 !
        if (!logFile.is_open()) {
            throw std::runtime_error("error");
        }
    }

   //외부에서 Delete 못함 
    ~LogManager() {
        if (logFile.is_open()) {
            logFile.close();
        }
    }

    // 복사 생성자와 대입 연산자 삭제 (복사 방지)
    LogManager(const LogManager&) = delete;
    LogManager& operator=(const LogManager&) = delete;

public:
    // 정적 인스턴스를 불러온다 
    // 만일 NULL이라면 새로운 인스턴스를 만든다.
    static LogManager* GetInstance() {
        if (instance == nullptr) {
            instance = new LogManager();
        }
        return instance;
    }

    // 로그 메시지를 파일에 기록
    void Log(const std::string& message) {
        if (logFile.is_open()) {
            logFile << message << std::endl;
        }
    }
};

// 정적 멤버 변수 초기화
LogManager* LogManager::instance = nullptr;

int main() {
    // 싱글톤 객체를 통해 로그 기록
    LogManager* logmanager = LogManager::GetInstance();
    logmanager->Log("Hello World.");
  
   
    LogManager* logmanager2 = LogManager::GetInstance();
    logmanage2->Log("This message uses the same logger instance.");
    //동일한 파일에 Append된다

    return 0;
}

 

 

static LogManager* instance는 클래스의 유일한 인스턴스를 저장합니다.

전역적으로 관리가 되기 때문입니다.

static LogManager * GetInstance()는 instance를 초기화하고 반환합니다. 

이 때 전역적으로 런타임에서 하나의 유일한 인스턴스를  저장합니다.

또한, 생성자와 소멸자를 private로 선언하여, 외부에서 직접적으로 호출할 수 없게합니다 

복사 생성자와 대입 연산자를 delete하여 외부에서 객체가 복사되지 않도록 방지합니다.

 

LogManager ::GetInstance()를 호출하면 유일한 LogManager 객체를 반환합니다.

Log() 메서드를 통해 로그 메시지를 기록합니다.

'C++ > C++ 용어 정리' 카테고리의 다른 글

GOF :: 데코레이터 패턴  (0) 2025.01.09
Const 란?  (0) 2025.01.07
생성자  (0) 2024.12.24

+ Recent posts