전략 패턴 (Stretegy Pattern)을 이용한 드래곤볼 게임 개발 #1

안녕하세요. 연두아빠에요.


드디어 디자인 패턴 관련해서 첫번째 게시물을 올리게 되었네요.


오늘은 간단한 콘솔 기반의 드래곤볼 게임을 개발해보려고 합니다.



물론 위처럼 캡숑 짱 멋진 게임을 만들려는 건 아니구요.


뭐 화려한 게임을 기대하시는 분들께는 다소 실망스러우실 수도 있겠지만...


목표는 디자인 패턴을 공부하는 것이니 최대한 심플하게 만들어보겠습니다.


불필요한 코드는 줄이고 최대한 이해하기 쉽게 진행하기 위해 C#을 이용하는게 좋겠네요.


C#을 모르시는 분이 보시더라도 충분히 이해할 수 있도록 쉽게 쉽게 풀어나가 볼까 합니다.



일단 우리가 만들고자 하는 게임의 대략적인 구상은 다음과 같습니다.



케릭터를 선택하면 파이팅 넘치는 액션씬이 나온 후, 다시 케릭터를 선택하게 됩니다.


진짜 흥미 진진한 게임이네요! 와우! 와우... 와우......



어쨋든, 이런 게임을 만들려면 어떤 구조가 가장 적합할까요?


간단히 생각해봐도 드래곤볼에는 손오공, 베지터, 피콜로, 크리링, 천진반 등 수십명의 케릭터가 존재하고


저마다 전투 방식이 다르고 하늘을 날 수 있는 사람도 있고 없는 사람도 있고 제각각 다른 특성을 갖는데요.


이거를 하나의 케릭터 클래스로 통합해서 개발하는 건 말이 안되는 것 같네요.


객체 지향 특성을 최대한 살려 상속 구조를 이용해 떠오르는 대로 만들어보면 이 정도가 될 것 같은데요.



자, 어때요? 깔끔하지 않나요?


음... 직접 구현해보니 실행도 잘 되고 문제 있어 보이는 부분은 없긴 합니다.


그런데 오공은 기를 이용해서 하늘을 날 수가 있고, 미스터 사탄과 부르마는 하늘을 날 수가 없네요.


거기다가 오공은 에네르기파와 같은 기를 이용한 전투를 하는 반면, 미스터 사탄은 기를 못 다루고요.


따라서 이 구조를 이용해서 게임을 개발하려면, 각각의 케릭터 마다 전부 Fly()와 Attack()을 재정의해서


케릭터 별로 어떻게 하늘을 날 수 있는지, 어떻게 공격을 하는지 명시를 해줘야 하겠네요.


그런데 드래곤볼 게임이 인기가 급상승 해서 유저들이 크리링 케릭터도 추가해 달라고 하네요.



일단 추가를 하고 보니, 무천도사 밑에서 함께 수련한 오공과 크리링의 전투 방식과 비행 방법이


매우 유사해서 중복코드가 발생합니다. 똑같은 코드를 오공 클래스와 크리링 클래스에 넣어야 할까요?


그렇다고 크리링과 오공을 같은 클래스로 할 수는 없습니다. 오공은 인간이 아니고 사이어인이니까요.


그렇다면 이렇게 한 번 해보는게 어떨까요?



오공과 크리링 처럼 기를 사용하는 격투가를 위해 중복 코드를 처리하는 부모 클래스를 하나 더 만들었습니다.


오공과 크리링은 비행 방법과 공격 방법이 거의 비슷하니 따로 재정의 해줄만한 것은 없겠네요.



자, 이번엔 이벤트를 한번 진행 해볼까 합니다. 손오공의 부인인 찌찌를 이벤트성 케릭터로 팔아보려구요.


찌찌는 미스터 사탄과 매우 유사한 전투 방법을 갖습니다. 비록 하늘을 날지 못하지만 싸움을 곧잘 합니다.


이번에도 역시 중복 코드를 만들 필요 없이 미스터 사탄과 찌찌를 위해 부모 클래스를 하나 더 추가해 봅시다.



구조가 나름 깔끔하고 괜찮네요. 이런 식으로 개발하면 금방 부자가 될 것 같은 기분이 드네요.


그런데 여기서 문제가 생겼습니다! 원작의 스토리에 새로운 설정이 추가되어 버렸네요.

미스터 사탄이 로켓 분사기를 메고 하늘을 날기 시작했어요!

실무에서도 이와 유사한 상황들이 많이 발생하곤 하죠...


이런 상황이 발생하는 순간부터 클래스 구조들이 꼬이기 시작합니다.


다시 미스터 사탄을 별도로 분리해서 하늘을 날 수 있도록 Fly() 함수를 재정의해야 겠네요.



사실상 FighterCannotFly라는 클래스 밑에는 찌찌 밖에 남아 있지 않기 때문에 없애도 되겠지만,


혹시라도 유사한 전투 방식을 갖는 케릭터가 생기면 밑에 넣으려고 남겨 뒀어요.


미스터 사탄의 경우는 FighterCannotFly를 상속받으면서 클래스 내부 내용을 전부 지워버렸었는데,


다시 상속을 제거하게 되면서 원래의 미스터 사탄 코드로 되돌린 후에 부랴 부랴 로켓 분사기를 이용해


하늘을 나는 기능을 추가해야 했습니다. 두 번 다시 기획이 대규모 수정되는 일이 없기를 기도해봅니다.



으악! 또 원작에 또 변화가 생겼어요.


원래 오공과 크리링의 전투 방식이 거의 유사해서 오공과 크리링을 하나의 부모 클래스로 묶어 놓았었는데


오공은 에네르기파 외에 계왕권과 원기옥 등의 다양한 필살기들이 추가 되어버렸네요.


거기다가 에네르기파 마저도 크리링의 것과는 차원이 다르게 강해서 코드를 공유하기가 쉽지 않아요.



어쩔 수 없이 크리링과 오공을 다시 분리하는 작업을 진행해야 할것 같습니다.


할 일이 태산이네요. 개발을 하는 것보다 원래 버전으로 되돌리고 거기서 발생하는 문제점들을 추적하는 게


말처럼 쉽지가 않고 너무 짜증이 나서 일하고 싶은 의욕마저 감소하려고 하네요.


어쨋든 일을 마무리 해야하니 진행을 해 봅시다.


허허... 찌찌가 FighterCannotFly를 상속 받고 있지만, 자식 클래스가 찌찌 하나 뿐이니...


결국엔 맨 처음 만들었던 방식으로 돌아온 것 같네요. 모든 케릭터의 클래스를 일일히 다 만들어주었네요.


물론 모든 케릭터들이 제 각각 특성이 달라져 버렸다는 히스토리가 있겠습니다만...


과연 여기에 중복 코드가 없을까요?


사실상 찌찌와 미스터 사탄은 로켓 분사기를 등에 메고 있다는 설정을 제외하면 동일한 코드를 사용되고 있고,


크리링과 오공도 거의 전투 방식이 비슷한데 오공의 에네르기파가 조금 더 업그레이드 되었고,


크리링에 비해 몇 가지의 추가 기술을 가지고 있는 것 뿐인데...


결국엔 크리링에 구현해 놓은 코드가 오공 클래스에도 유사하게 존재하게 되고, 찌찌와 미스터 사탄도 마찬가지죠.


더불어 찌찌 외엔 사용하지도 않는 FighterCannotFly라는 클래스 좀 보세요.


더이상 하늘을 날지 못하는 케릭터는 추가 예정이 없다고 하는데 이거 지우기도 애매하고...


해당 클래스를 만든 사람은 이미 퇴사 해버려서 맘대로 수정하기도 애매한 상황이 되어버렸습니다.



아... 이건 아닌 것 같은데... 이러다 이상한 케릭터 하나 더 추가되면 또 구조를 다 바꿔야 하는거 아닌가?


머리를 쥐어 짜며 고민하고 있는데 기획팀에서 씩 웃으면서 또 다가와서는 한가지 더 수정해 달라고 하네요.

미스터 사탄이 메고 있는 로켓 분사기가 공격을 받으면 부서지게 해주세요!

이건 또 아닌 밤 중의 홍두깨 같은 소리란 말인가...


미스터 사탄은 분명히 하늘을 날 수 있는 케릭터로 설정되었는데, 게임이 진행되는 도중에 로켓 분사기가 부서지면


하늘을 날지 못하고 추락을 해서 땅에서만 싸워야 하는 설정이 추가 되었다네요.


게임이 진행되는 도중에! 실시간으로 하늘을 날고 못 날고도 결정되어야 하는 새로운 상황이 발생했습니다.


하늘을 날 수 있는 미스터 사탄과 하늘을 날지 못하는 미스터 사탄 두개의 클래스를 만들어야 할까요?


에이... 그건 정말 아닌 것 같아요. 너무 우스꽝 스러운 코드가 될 것만 같네요.


결국엔 미스터 사탄의 Fly() 함수에 서너개의 조건문을 추가 해서 예외 상황들을 처리해야 하겠네요.



여기까지... 가상의 시나리오를 통해 드래곤 볼이라는 게임을 만들어 보았는데 어떠신가요?


처음 게임을 만들기 시작했을 때 부터 마지막 이슈까지 총 여섯 번의 이슈가 발생했는데요.


여섯 번 모두 구조를 적지 않게 변경을 해야 하는 수고를 겪어야만 했습니다.


앞으로 계속 해서 기획이 변경되고 새로운 케릭터가 추가 될 텐데...


애초의 깔끔한 설계 구조를 유지하기가 좀 처럼 쉽지 않을 것 같네요.


이슈가 발생할 때마다 계속해서 설계 구조를 변경하고 예외 처리 코드가 덕지 덕지 붙게 될 것 같습니다.



팀장님이 기획이 더 변경되기 전에 클래스 설계 구조를 한번 정리를 하고 가자고 하는데요?


어떻게 하는 것이 좋을까요?


이런 상황에 딱 맞는 디자인 패턴이 하나 있습니다.


바로 전략 패턴, 스트레티지 패턴(Stretegy Pattern) 이라는 녀석인데요.


다음 포스팅에서 이 전략 패턴을 사용해서 한번 이런 지속적인 기획의 변경에도 적절히 대응 할 수 있는


방법을 알아보고 직접 C# 코드로 드래곤볼 게임을 개발 해 보도록 하겠습니다.


공감() 및 댓글은 글쓴이에게 커다란 힘이 됩니다.


길지 않은 이 글을 쓰는데 나름 몇 시간이 걸렸어요^^;


저에게 1초만 시간을 내주셔서 공감 버튼 꾸욱 눌러주세요^^


제 블로그를 방문해 주신 모든 분들 사랑합니다^^


이상입니다. 감사합니다!


이 글을 공유하기

댓글

Designed by CMSFactory.NET