jobGuid 꽃미남 프로그래머 "Pope Kim"님의 이론이나 수학에 치우치지 않고 실무에 곧바로 쓸 수 있는 실용적인 셰이더 프로그래밍 입문서 #겁나친절 jobGuid "1판의내용"에 "새로바뀐북미게임업계분위기"와 "비자관련정보", "1판을 기반으로 북미취업에 성공하신 분들의 생생한 경험담"을 담았습니다. 3ds Max를 사용해서 게임용 3D 캐릭터를 셋업하는 방법
이를 위해 오랜 실무를 경험해 온 저자의 고급 노하우들이 공개
위 내용은 GameDevForever의 저자분들의 홍보를 위하여 운영진 자체적으로 올린 광고이며 일체의 수익이 없습니다.(밥좀사줘요~)
Posted by 스톰(서광록)

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

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

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

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

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

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



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

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

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

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

to be continued...

[주의] 본 필자는 전문 프로그래머가 아니므로 포스팅 내용 중에 사소한(!) 오류가 있을 가능성을 부인하지 않습니다.


댓글을 달아 주세요

  1. Favicon of http://gamedevforever.com 월하 2011.12.27 09:39 신고  댓글주소  수정/삭제  댓글쓰기

    역시 스톰님....
    처음부터 굉장히 유용한 지식 보따리를 푸시는군요. ㄷㄷㄷㄷ
    아.. 제 글이 떨어트린 팀블로그 퀄리티를 스톰님이 대폭 상승 시켜 주십니다.

  2. Favicon of http://dishdev.me/ Dish 2011.12.27 10:02 신고  댓글주소  수정/삭제  댓글쓰기

    프로그래머들 많아서 뭐 하나 잘못 적으면 퐆풍 태클 들어올지도요 ㅋㅋ

  3. Favicon of http://twitter.com/choijaekyu 최재규 2011.12.27 10:31 신고  댓글주소  수정/삭제  댓글쓰기

    와우! 어떤 C++ 책보다 가상함수를 이렇게 쉽게 설명하는 글은 처음이에요!

    이 글과 더불어 김학규님의 전투 프로그램이 개론(http://www.lameproof.com/165747)을 함께 보시면 좋을 것 같아요ㅎㅎ

  4. sgpro 2011.12.27 10:41 신고  댓글주소  수정/삭제  댓글쓰기

    고맙습니다. ^^

  5. Favicon of http://gamedevforever.com 스톰(서광록) 2011.12.27 13:39 신고  댓글주소  수정/삭제  댓글쓰기

    솔직히 고백하자면 무심코 글을 쓰다가 중간에 임시저장을 한번 했을때 오늘이 제가 포스팅 하는 날인 걸 알게 됐습니다. ㅎㅎ 포프님의 보이지 않는 힘에 이끌려서 쓴 걸까요?!

  6. Favicon of http://gamedevforever.com cagetu 2011.12.27 14:05 신고  댓글주소  수정/삭제  댓글쓰기

    기획님들 이야기는 언제나 재밌어요.. ^^.

  7. Favicon of http://gamedevforever.com 귀거리 2011.12.28 11:29 신고  댓글주소  수정/삭제  댓글쓰기

    재미있는 이야기 계속 기대하고 있겠습니다~!!!

  8. 미친고양이 2011.12.28 19:43 신고  댓글주소  수정/삭제  댓글쓰기

    스톰님 블로그에 댓글 달았다가 여기에도 달라고 하셔서 댓글 순례. 오오 끊어진 연재물을 다시 이어지게 만드는 포프님의 마력! 그런데 예전 연재물도 여기 같이 올리는 게 낫지 않을까요?

    • Favicon of http://gamedevforever.com 김포프 2011.12.29 04:00 신고  댓글주소  수정/삭제

      이제 제 마력이 미친고양이님께 어떤 영향을 미치는지 지켜볼 차례 룰루~... (여태까지 티스토리 쪽 문제로 가입이 안되는 사람이 딱 한명있었음.. 미친고냥이님 -_-)

  9. Favicon of http://gamedevforever.com 대마왕J 2011.12.28 23:11 신고  댓글주소  수정/삭제  댓글쓰기

    후후후 기존에 쓰신 글도 천천히 다시 올려주세요!

  10. Favicon of http://gamedevforever.com 스톰(서광록) 2011.12.29 00:27 신고  댓글주소  수정/삭제  댓글쓰기

    옛날에 연재하다가 흐지부지된 글들을 여기서 좀 정리+업글 해서 쓰려고 합니다 ㅎㅎ

  11. Favicon of http://kindtis.tistory.com/ 친절한티스 2011.12.29 11:18 신고  댓글주소  수정/삭제  댓글쓰기

    이해가 쏙쏙~ 되는 유익한 글이었습니다.

    스톰님 짱~

    • Favicon of http://gamedevforever.com 김포프 2011.12.30 02:53 신고  댓글주소  수정/삭제

      절대 동감.. 근데 트위터를 보니 스톰님이 프로그래밍이 너무 쉬운 직업 같다고 프로그래머로 전향하신데요~ ㅋㅋㅋㅋ 우리 이제 다 죽었음 -_-;

    • Favicon of http://gamedevforever.com 스톰(서광록) 2011.12.30 09:02 신고  댓글주소  수정/삭제

      허허... 엄살이 심하십니다.
      저 같은 놈이 코드 좀 깔짝댄다고 흔들리실 분들이 아니면서 ㅎㅎ

      게다가 이미 나이가 차서 회사에서도 관리직으로 빠지고 있으니 프로그래밍 잘 한다고 해도 ERP 같은 거나 손보라고 할듯요

  12. Favicon of http://gaebit.tistory.com zinzza 2011.12.29 13:01 신고  댓글주소  수정/삭제  댓글쓰기

    아는것과 설명할 수 있는건 다르죠.
    종종 무슨무슨 박사 라는 사람이 나와서 못알아먹는 소리만 하잖아요--?

    이해하기 좋은 설명입니다. (저도 이해가 막되요-o-)
    앞으로 글들도 기대하겠습니다^^

  13. Favicon of http://gamedevforever.com 김포프 2011.12.30 02:52 신고  댓글주소  수정/삭제  댓글쓰기

    사실 프로그래밍 학생들에게 "polymorphism이 뭔지 설명해봐라"라고 해도 한마디로 딱 설명 못하는 사람들이 많아요. 그냥 사용례를 줄줄 나열하더라구요. 전 대학에서 가르칠때 폴리모피즘을 "same interface, different behaviour"라고 설명을 했었어요. "인터페이스는 같지만 행동은 다르다" 정도?

  14. 우와... 2012.06.27 10:16 신고  댓글주소  수정/삭제  댓글쓰기

    전달력이 장난이 아니시네요..
    내공있는 글이다..ㅎㄷㄷ



티스토리 툴바