싱글톤 패턴 :
싱글톤 패턴은 애플리케이션에서 클래스의 인스턴스를 단 하나만 생성하고, 이를 전역적으로 접근할 수 있도록 보장하는 디자인 패턴입니다.
예를들어서 언리얼엔진에서 로그를 남기는 것을 예로 들겠습니다. 로그를 남길 수 있는 인스턴스는 프로그램에 하나만 존재하고, 어디서든 접근 가능해야합니다 !
#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 |