sykim25 wrote:하지만 아무래도 가장 큰 문제가 되는 건 상속이 아닐까요?
zupet 님처럼 한다면 상속시에 코드를 다시 고쳐야 할텐데
만약 라이브러리(*.lib)였다면 싱글톤 방식이 더 안전할 것 같은 느낌입니다.
글 중간중간에서 언급 했었는데 '현재 사용하는 게임 프로그래밍'이란 전제 조건이 붙었습니다. 라이브러리를 ㅎ파는 것도 아니고 규모가 큰 작업을 하는 것도 아니고 얼굴도 모르는 다른팀에서 문서와 라이브러리를 던져주는 일이 일어나지 않는다는 조건이 포함된다고 생각합니다. 업체에 따라서 정말 독립된 부서로 명세서만 던져주고 일하는 경우가 있을 수 있지만 대다수 프로그래밍을 할때는 다같이 모여있고 문제가 나면 E-mail 나 업무요청서가 아니라 고개를 돌려서 '~~~씨 이거 어떻게 하는거예요?' 라고 물어보는 업무 방식을 취하고 있지 않나요? ^__^
sykim25 wrote:글쓰다가 GPG1권 내용을 다시 참고하니
가장 중요한 차이점은 객체의 생성/소멸 시점을 통제하는 것이네요.
약간 첨언을 하자면 '왜 객체의 시작과 종료가 반드시 생성자/소멸자여야 할까요?' 라는 질문을 덧붙이고 싶습니다. 단일체(싱글톤)을 쓴다면 이러한 이유는 간단히 설명이 됩니다. 사용자가 신경쓰지 않고 초기화가 되어야 하고 소멸시에 간단히 종료가 되어야 겠죠. 그렇지만 제가 앞에서 언급한대로 초기화의 시점과 위치를 특정할 수 있다면(WinMain 같은) 간단히 그 위치에서 초기화나 종료 함수를 호출해 줄 수 있다는 것입니다.
네.. 별로 객체지향적으로 보이지 않습니다. 예전에 저도 생성자의 순서에 따라 문제가 생기는 경우를 경험한 적이 있는데 여러가지 고민 및 고생 끝에 내린 답변은 '내가 왜 WinMain이 호출되기 전에 이 작업을 해줘야 했던거지?' 라는 생각이 들면서 실제 이 엉뚱한 문제는 아주 사소한 것이고 개발 작업과는 전혀 관계없는 것을 큰 문제로 만들어 버렸다는 것입니다.
짜놓고 보면 WinMain 과 같이 '가장 큰 함수'에서 여러가지 초기화 및 정리를 호출해 주는 것은 전체 코드가 더 깔끔해 보입니다. 한곳에 모아서 전체가 초기화 되는걸 볼 수 있으니까요. 단.. include 좀 해줘야 하죠. 긁적.. 어쨌거나 대부분의 게임은 프로그램이 시작할때 무엇을 어떤 순서로 준비해야 할지 확실히 알고 있고 그것을 실행해줄 수 있습니다. 단지 그 방식이 어떤 접근 방식을 쓰고 있느냐는 것이죠. 혹시 이런 코드를 만드신 분이 없는지 궁금하네요.
MyClass::GetInstance()->Init();
제가 얻은 교훈 한가지... 자신의 취향 때문에 문제를 복잡하게 푸는 것은 백해무익이다!!!!
p.s.경우에 따라선 취향 = 멋진 디자인 이란 대체어가 붙기도 합니다.