원문
싱글톤 패턴은 한 가지 클래스에 대해 한 가지 인스턴스만 보장하는 방법이다. 즉, 클래스를 전역변수와 비슷한 느낌으로 사용할 수 있다. 그러면 바로 의문이 드는 것이, 어떻게 한번 이상의 인스턴스화를 막을 수 있냐는 것이다! 한번 배워보도록 하자.
MyObject *myObject = new MyObject();
일반적인 클래스의 경우 위와 같이 새로운 인스턴스를 생성할 수 있다. Public 클래스라면 원하는 만큼 인스턴스를 만들수 있다. 그런데 만약 Public이 선언되지 않은 함수라면 어떨까? 아래와 같이 생성자가 protected로 되어 있으면 말이다.
class SingletonPattern{ private: protected: SingletonPattern(); public: }
이런 상태라면 인스턴스화 자체가 안된다. 인스턴스화를 하려면 인스턴스가 이미 존재해야하는 패러독스에 빠진다.. ㄸ
한가지만 더 실험해 보자, 만약에 public에다가 static으로 인스턴스를 생성하는 맴버변수를 하나 생성해놨다면 어떨까..? 아래와 같이 말이다.
// SingletonPatternExample.h class SingletonPattern{ private: protected: SingletonPattern(); public: static SingletonPattern* instance; static SingletonPattern* sharedInstance(); }; // SingletonPatternExample.cpp #include “SingletonPatternExample.h” SingletonPattern* SingletonPattern::sharedInstance(){ if (instance==0){ instance=new SingletonPattern(); } return instance; }
이렇게 한다면 이 클래스가 인스턴스화가 가능할까? 그렇다. 다음과 같이 할 수 있다.
SingletonPattern *mySinglton=SingletonPattern::sharedInstance();
그러니까 이 인스턴스가 널포인터면 protected constructor로 맴버함수 내에서 인스턴스화를 시킨 후 포인터를 뱉어주는거고, 만약에 널포인터가 아니면, 원래 참조값 넘겨주게 된다.
구현
그럼 이제, 실제 구현된 싱글톤 패턴을 통해서 감 좀 잡아보자.
// SingletonPattern.h file class SingletonPattern{ private: //1. private 변수 int i; protected: //2. 생성자 SingletonPattern():i(0){}; //3. 소멸자 ~SingletonPattern(){}; public: //4. static instance for class singleton static SingletonPattern* instance; //5. shared instance for the singleton static SingletonPattern* sharedInstance(); //6. set the value of i void setValue(int uValue); //7. get the value of i int getValue(); };
라인 2에 생성자가 존재하고, 이게 직접적으로 사용되는 때는 라인 4와 라인 5에서이다. sharedInstance();를 사용하면 어디서든지 이 static 클래스에 접근할 수 있을 것이다.
구현부는 아래와 같다.
// SingletonPattern.c file #include "SingletonPattern.h" SingletonPattern* SingletonPattern::instance=0; SingletonPattern* SingletonPattern::sharedInstance(){ if (instance==0) { instance=new SingletonPattern(); } return instance; } void SingletonPattern::setValue(int uValue){ i=uValue; } int SingletonPattern::getValue(){ return i; }
여기서 set / get 함수가 지리는 포인트인데, 아래와 같이 어느 곳에서든 이 글로벌 클래스(?)에 접근할 수 있는 것이다!
SingletonPattern *singleton=SingletonPattern::sharedInstance(); singleton->setValue(5); in myValue = singleton->getValue();
어느 곳에서든지 값을 변경할 수 있고 어디서든지 값을 읽어올 수 있다.
더 깊게 공부하고 싶다면 알아보려면 Head Fisrt-Design Pattern 책을 보면 도움이 될 것이다.
'Engineer > 물리엔진' 카테고리의 다른 글
[번역] 렌더링 엔진 동작 원리 찍먹해보기-2 (0) | 2022.04.05 |
---|---|
[번역] 렌더링 엔진 동작 원리 찍먹해보기-1 (0) | 2022.04.05 |
[감 익혀보기] Strategy Design Pattern with C++ (0) | 2022.03.31 |
게임엔진에 사용되는 디자인 패턴(Harold Serano) (0) | 2022.03.28 |
물리엔진 개발 로드맵(Harrold Serrano) (0) | 2022.03.27 |
댓글