싱글턴패턴은 가장 익숙한 패턴이 아닐까 싶다.
처음 게임구조를 익히면서 가장 먼저 접하게 되는 것 같다.
특히 매니저라는 이름의 클래스를 만들 때 항상 봤던 것 같고, 나도 항상 사용해왔다.
싱글턴은 무엇인가?
단 하나의 인스턴스만 있게하고 싶고, 동시에 전역적인 접근이 필요할 때 싱글턴 패턴을 사용한다.
이는 static instance 와 생성자를 private으로 둠으로써 해결한다.
이런 특징으로 manager로서 많이 사용이 된다.
하지만 '게임프로그래밍 패턴'의 저자인 로버트 나이스트롬은 자신은 싱글톤을 사용한 적이 없다며
지양해야 한다고 말했다.
이유인 즉, 회사에서는 여러사람이 관리하며 최대한 커플링되지 않아야 한다. 그러나 전역적인 접근은
아무것도 모르는 신입이 잘 짜여진 구조를 유지하려는 생각보다 당장 해결하기 위해 사용하여 구조를 망가뜨릴 위험이
발생할 수 있다고 한다.
또 싱글턴 패턴은 한개의 문제에 대한 해결책만 필요할 때도 두가지 문제를 해결해준다.
바로 '단 하나의 인스턴스' 와 '전역 접근' 이다.
그렇지만 저자의 비유를 가져오자면 싱글턴은 치료제가 아닌 진정제라고 한다.
원래 객체로 넘길 수 있는 코드는 최대한 넘기자.
객체의 이동이나 어떤 동작들은 그 객체가 가지고 있는 것이 oop이다.
또 단 하나의 인스턴스가 필요할 때는
class a
{
public a(){ IsCreated = true; }
public ~a(){IsCreated=false;}
static bool IsCreated
}
이렇게 static 변수로 해결이 가능하다.
또 전역접근은
class GameObject
{
public static Engine engine;
}
class Player : GameObject
{
}
class Monster : GameObject
{
}
이런식으로 상위클래스에 static 변수로 둬서 접근이 가능하게 할 수 있다.
따라서 아무것도 모르고 싱글턴을 사용하는 자세는 지양해야한다.
나 또한 아무 생각없이 총알,몬스터? manager로 관리해야지! -> manager는 싱글턴이지! 이렇게 배웠고 그대로 사용해왔다.
다른 프로그램도 그렇지만 성능이 특히 중요한 게임에서는 최적화가 아주 중요한데, 이렇게 뭘 써야할지에 대해서 하나하나 깊이 있는 고민과 또 언어에 대한 정확한 이해를 바탕으로 해야한다는 말이 무엇인지 조금은 느낄 수 있었다.
oop가 무엇이고 잘 짜여진 구조가 무엇이며 어떻게 만들어가는 것인가에 대해서도 이런 책을 읽으며 하나씩 배워가야겠다.
싱글턴 대신에 이런 방법도 있구나하며 배워가게 된다.
그리고 이건 싱글톤과는 무관한데, 연결리스트를 C, C++로 구현해봤다면 포인터로 구현했을텐데,
이 때, 항상 예외코드를 달아줘야했다.
포인터가 head라면?. tail이라면?
근데, 이 책의 저자가 작성한 코드를 보고 개발 후 처음으로 우와라는 소리가 나왔다.
이중포인터로 이 예외를 다 없앤 우아한 코드라는 것을 느낄 수 있을거라는 저자의 말처럼
이런게 우아한 코드인건가 하는 생각과 포인터는 알수록 활용도가 높겠구나를 알게될 것이라고 생각한다.
void Subject::removeObserver(Observer* observer) {
Observer** current = &head_;
while (*current != NULL) {
if (*current == observer) {
*current = (*current)->next_;
observer->next_ = NULL;
return;
}
current = &(*current)->next_;
}
})
코드는 아래에 있는 사이트에서 가져왔다.
https://gist.github.com/parkpd/4638874487a358e27957971394d42e90
ch4. pointer of pointer.cpp
GitHub Gist: instantly share code, notes, and snippets.
gist.github.com