적절한 시스템 기획을 위한 추상화 이야기 (1) by storm

제가 게임개발 교육기관에서 시스템 기획 강의를 할 때, 학생들이 가장 이해하기 힘들어 하던 부분은 바로 추상화(abstraction)였습니다. 물론 초급 경력자들 중에도 추상화를 개념적으로만 이해하지 실무적으로 제대로 활용하는 사람은 그리 많지 않을 것입니다. 아무래도 직접 코드를 짜면서 만들어보지 않고서는 정확하게 이해하기가 어려운 개념이기도 하고, 또 개념적으로는 이해하더라도 실전에서 잘 활용하려면 그만큼 훈련과 경험이 필요한 것이 바로 추상화일 것입니다.

보통 객체지향을 설명하는 책에서는 추상화를 이렇게 설명합니다. 닭이 최하위 개념이면, 그보다 추상화된 상위 개념으로 조류, 그 윗단계로 동물, 그 다음은 생물... 혹은 한국인 -> 동양인 -> 인간... 뭐 이런식이죠. 이런 설명을 들으면, "아, 추상화란 것은 뭔가 구체적인 개념에서 추상적인(포괄적인) 범주로 올라가는 거로구나..."라고 개념적으로는 이해할 수 있습니다. 하지만 프로그래머로서 공부를 더 깊이 있게 하고 코드를 실습하지 않는 한, 대개는 거기까지만 이해하고 끝납니다. 쉽게 말하면, 뭔가 알아 먹긴 했는데 써먹지는 못하는 그런 상태에서 그치는 거죠.

그래서 이런 기획자에게 무기 아이템을 기획하라고 하면 보통은 이렇게 됩니다:
"무기에는 한손 무기, 양손 무기가 있고, 한손 무기 중에는 단검, 도검, 한손 도끼, 망치... 양손 무기에는 양손 검, 양손 도끼... 어? 활이나 석궁은 어디에 분류하지? 근접무기, 원거리 무기로 나누어야 하나? 어 이거 어떻게 하지? 안돼~에! 사람 불러야 돼~!!!"

대부분의 경우, 프로그래밍을 모르는 기획자에게 객체지향에 대해서 가르치면, 클래스, 인스턴스, 상속 같은 주요 개념들은 이해를 합니다. 하지만 실전에서 그것을 써먹지 못하는 이유는 (제가 판단하기에) '가상함수와 다형성'을 모르기 때문이라고 생각합니다. 이거야 말로 직접 코드를 만져보지 않으면 제대로 이해하기 어려운 개념이지요.

이글이 프로그래머를 위한 아니기 때문에 아주 쉽게 설명하자면, 가상함수란, 어떤 명령을 내리는데 구체적으로 뭘 할지는 명령을 받는 놈에 따라서 다르게 들어가는 것입니다. 

일단 예를 들어봅시다. 스타크래프트에서 각 유닛들은 이동방식이 다릅니다. 질럿이나 마린 같이 지면에서 걸어다니는 유닛이 있는 반면에, 레이쓰나 캐리어 같이 공중에서 날아다니는 비행유닛도 있습니다. 하지만 플레이어들이 이 유닛들에게 너는 걸어서 이동하고 너는 날아서 이동해라! 라고 유닛별로 다른 이동명령을 내리지는 않죠? 플레이어는 단지 Move 나 Patrol 같은 명령만 내릴 뿐이고, 각각 어떤 방식으로 이동할지는 유닛이 알아서 합니다.

 


이런 것이 가능한 이유는 객체지향 프로그래밍 언어에서는 상위 클래스에서 가상함수로 선언한 (추상화된) 기능을 그 하위 클래스들마다 다르게 재정의(Override)해서 받아들일 수 있기 때문입니다. 그렇기 때문에 Move라는 동일한 명령을 내려도 어떤 놈은 걸어서 가고 어떤 놈은 날아서 갈 수 있는 것이죠.

이와 같이, 추상화를 제대로 이해하려면 가상함수와 재정의를 이용한 객체지향의 특성인 다형성(Polymorphism)을 이해해야 합니다. 대부분의 경우 추상화란 각각의 최하위 객체(인스턴스)들이 갖게될 요소들 중에서 공통적인 부분을 찾아내서 그것을 상위 클래스로 올리는 작업인데, 다형성을 이해하지 못하고서 '공통성'을 제대로 찾아낼 수 없기 때문입니다.

객체지향을 설명하는 책을 보면, 객체지향적으로 설계된 프로그램에서는 객체와 객체 사이에 메세지를 주고받으며 동작한다고 말합니다. 위에서 예를 든 바대로 설명하자면 Player 객체가 Unit 객체에게 Move라는 메세지를 주면 Unit이 이동하는 것이죠. 그리고 다형성이란, 각각의 Unit들의 속성에 각자 고유한 이동방식이 설정되어 있어서, Player가 Move라는 가상함수 메세지를 각 Unit들에게 보내면, 각 Unit들은 자신이 가진 이동방식에 따라 Walking 방식으로 이동하기도 하고 Flying으로 이동하기도 하는 것입니다. - 만약 확장팩이 나와서 잠수항행이라든지, 물위에서 떠다니는 호버크래프팅 같은 새로운 이동방식이 추가된다 하더라도 Player는 단지 Move라는 명령만 내리면 됩니다. 한 마디로 유연성, 확장성을 갖는 프로그램이 되는 것이죠.

블로그 포스팅에서 무한정 설명을 할 수는 없는 노릇이니, 더 자세한 부분은 객체지향의 개념을 잘 설명한 책이나 문헌을 참고하시기 바랍니다. 다음에 이어질 포스팅에서는 실제 시스템 기획에서 제대로 된 추상화를 하기 위한 보다 실무적이고 구체적인 예시를 써볼까 합니다.

to be continued...


// 본 포스팅은 게임개발 포레버 www.gamedevforever.com의 기획 카테고리에 동시 연재됩니다.

덧글

  • 케인 2011/12/27 13:22 # 답글

    좋은 글 감사합니다 :)
  • storm 2011/12/27 23:21 #

    헤헷 :D
  • 미친고양이 2011/12/27 20:53 # 답글

    댓글은 여기에 올리면 되나요? 게임개발 포에버에 올리면 되나요? 잘 봤습니다.^^
  • storm 2011/12/27 23:21 #

    양쪽 다 올리세요!!
  • 기획자 2011/12/28 12:18 # 삭제 답글

    역시, 게임기획에 관한한 스톰님의 블로그 만큼 좋은 곳은 없는 것 같습니다.

    프로그래밍이 좋아서 공부했다가 많은 것을 잃어 버린 제가 봤을 땐

    후배님들이나 지망생분들이 이글을 보고 '객체지향'등의 프로그래밍 지식을 기획자가 꼭 알아야 하는 소양으로 받아 들일까봐 걱정이네요.

    아는 사람은 잘 알듯이, 프로그래밍 지식은 기획자에겐 '양날의 검'이잖아요
    체계적이고 구조적인 사고를 갖는 만큼,
    창의적인 생각을 잃어 버리게 되는데....

    아직 잘 모르는 지망생분들을 위해서 주의 문구 같은걸 추가해 주시면 안될까요? ^^ ㅎㅎ
  • storm 2011/12/28 12:32 #

    저는 프로그래밍 지식이 기획자에게 '양날의 검'이라고 생각하지 않습니다.
    물론 부작용을 일으키는 사람이 전혀 없지는 않겠지만, 부작용에 대한 우려에 비해 알았을 때 이점이 훨씬 더 크다고 생각하구요.

    생각하기 나름이겠죠. 기획자에게 있어서 프로그래밍 지식은 아이디어의 구현여부를 검증하는 용도가 아니라 아이디어를 구체화하고 구현할 사람들과 커뮤니케이션 하기 위한 용도라고 생각하면 됩니다.

    다른 포스팅에서도 언급했었지만, 어차피 부정적인 마인드를 가진 사람은 프로그래밍 지식이 있건 없건 아이디어를 꺾습니다 ㅎㅎ
  • 기획자 2011/12/28 13:48 # 삭제 답글

    양날의 검은 '능력' 보다는 '시간'에 더 초점을 둬서 말씀드려야 했는데 오해를 불러 죄송합니다^^;

    일단, 실무로 기획자가 게임 구조와 관련된 지식을 습득해서 스스로 구현 여부를 검증하고 프로그램 파트와 커뮤니케이션을 원활하게 해야 한다는 말씀에 전적으로 동의합니다.




    단, 모든 기획자들이 본문에 있는 객체지향에 대한 부분까지는 알 필요가 없다는 게 저의 생각입니다.

    많은 초심자 분들이 '기획자는 프로그래밍도 잘 알아야 해'라는 선배들의 말에 무턱대고 망망대해에 뛰어들어 너무 많은 시간을 소비하는 걸 봐왔는데요.

    하지만, 객체 추상화 상속 뭐 이런건 실제 프로그래머가 코딩을 하다보면 자연스럽게 이해가는 지식이고요. 초보 프로그래머들도 쓰기만 할 뿐이지 개념을 이해하기는 어려운 부분입니다.

    기획자가 나중에 c기반이 아닌 객체지향 기반의 언어로 스크립트를 하다 보면 겨우 이해하게 되긴 하겠죠.


    저는 이처럼 '코딩력'이 없으면 실제로는 알기 힘든 개념적인 지식에 아까운 시간을 쏟는 초심자분들을 많이 봐왔습니다...


    스톰님의 블로그를 자주 보는 사람 중 한 명으로 써,
    지망생이나 초보 기획자들에게 미치는 영향이 얼마나 큰지 알고 있기 때문에

    주의 문구가 필요하지 않나 생각해서 말씀드린 겁니다.
  • storm 2011/12/28 14:14 #

    일리가 있는 말씀이십니다.
    그래서 항상 프로그래밍적인 이야기를 할 때는 '시스템 기획'이라는 단서를 달고 있죠.

    저 역시 전문 프로그래머가 아니기 때문에 '직접 코드를 만지지 않는' 사람도 이해할 수 있도록 객체지향을 설명하는데 중점을 두고 있습니다.

    그간의 독학과 강의 경험을 토대로 판단하자면, 프로그래밍 지식이나 코딩 실력, 경험이 크지 않아도 적당한 수준의 개념이해와 더불어 워3 에디터나 Unity, Unreal 등의 개발툴을 다루다보면 기획자에게 필요한 수준의 객체지향적 소양은 갖출 수 있다고 봅니다.

    아무튼 염려해주셔서 감사합니다.
  • storm 2011/12/28 14:22 #

    덧붙이자면, 말씀하신 그런 '삽질'을 최대한 피해가도록 좀 더 쉽고 빠르게 객체지향과 같은 시스템 기획에 필요한 개념을 설명하려는 게 제 의도라고 할 수 있겠습니다.
  • 기획자 2011/12/28 14:39 # 삭제 답글

    결과적으로 제가 엉뚱한 테클을 하게 됐습니다~ 꾸벅!

    시스템 기획을 더 수준 높은 기획이라고 잘 못 생각하는 기획자들이 많아 답답하던 중에

    블로그 독자중에 시스템 기획자와 컨텐츠 기획자도 구분 못하는 초심자들이 오해를 할 까 봐
    제가 오바를 했네요


    앞으로도 좋은 시스템 기획 강의를 부탁드립니다^^

    추가로, 시스템 이외에도 좋은 다른 분야도 계속 올려주시면 감사 하겠습니다~!
  • storm 2011/12/28 16:48 #

    태클은 아니었구요. 말씀하신대로 지망생들은 충분히 잘못 이해할 수 있는 사안이죠.
  • 2011/12/28 17:52 # 답글 비공개

    비공개 덧글입니다.
  • storm 2011/12/29 00:16 #

    '게임 디자이너'는 아트쪽, 그러니까 그래픽 디자이너를 말씀하시는 것 같군요.
    꼭 미대를 나올 필요는 없지만 아무래도 관련 전공을 하는 쪽이 아무래도 더 유리하기는 합니다.
    대학에서 전공을 하면 아무래도 대입 실기시험 준비 때문에라도 기본기부터 연마를 더 하게 되니까요.

    그리고 기획자를 할 경우 뭐 꼭 명문대를 나와야만 하는 건 아니지만 좋은 대학을 나오면 좀 더 유리한 건 사실입니다. (특히 NC소프트 넥슨과 같은 대기업의 신입 공개채용에서 서류전형을 통과하려면 일단 대학간판이 좀 필요하긴 하죠.)

    전문대를 나와서 가는 방법이란게 따로 있는 것이 아니라, 고졸이거나 대학 간판이 약할 경우 '실력'으로 커버하면 됩니다. 하지만 개인적으로는 일단 고등학생이시라면 학교 공부 열심히 하셔서 좋은 대학을 가는 걸 우선시 하면서 게임 개발자로서 공부는 대학입학 후로 미루거나 아니면 수능보기 전까지는 그냥 취미로 즐기시는 것을 권합니다.

  • 지게차따위 2012/01/02 12:14 # 답글

    대학편입후 게임기획을 목표로삼으며 준비하는 학생입니다!
    사실, 처음엔 스토리와캐릭터개발등등 막연하게 재밌겠다ㅡ라는생각으로 시작했었습니다.
    하지만 선배들과 현업에서 일하시는분들의 말씀을 들어보니 단순히
    스토리텔링이나 캐릭터콘텐츠 만 공부한다고 되는게 아니란걸 알고
    제 자신이 얼마나 단순했는가 통감하고있습니다.

    그래도 여전히 게임을 기획하고자하는 생각은 변함없이
    지금 졸업작품으로 컴퓨터소프트과 학우들과 연계하여 앱용 게임을준비하고있습니다
    하여 지금 게임기획을 위해 정보와 공부를 준비중인데 이렇게 지표를 열어줄
    글들을 보게되어 영광입니다. 블로그의 포스팅을 유용히, 감사히 읽겠습니다!
  • 과일소주 2012/01/22 17:55 # 삭제 답글

    한번 시간 잡아서 자바 객체 이야기를 앉아서 봤던 내용이 잘 정리가 되네요.
댓글 입력 영역



통계 위젯 (화이트)

3727
192
500409