[GPG 1 글 1.1] [s1.1] 설계 패턴 이야기 #2 - RPG 멀티 클래스 캐릭터와 다중

GPG 시리즈 관련 질답, 논의 공간.

Moderator: 류광

류광
Posts: 3805
Joined: 2001-07-25 09:00
Location: GPGstudy
Contact:

Post by 류광 »

이 글은 예전 GPG 스터디 포럼에 gryu 님이 올리신 주제와 그에 대한 답글들입니다. 원본(Ezboard)은 "<a href="http://pub32.ezboard.com/fgpgstudyfrm2. ... D=38.topic" target="_blank">[s1.1] 설계 패턴 이야기 #2 - RPG 멀티 클래스 캐릭터와 다중 상속의 문제</a>"입니다.
<div class="imported">
<div class="sep"><span class="cfs">제목: [s1.1] 설계 패턴 이야기 #2 - RPG 멀티 클래스 캐릭터와 다중 상속의 문제
</span></div>
<div class="r">글쓴이: gryu , 글쓴때: 1/29/01 12:54:21 am</div>

캐릭터의 클래스 - 한글화된 게임에서 흔히 '직업'이라고 하는 거 있죠.. 멀티 클래스 캐릭터란.. 예를 들어 전사이면서 동시에 마법사인(전투 마법사?) 캐릭터를 말합니다(그런데 듀얼 클래스와는 어떤 차이인지?)

어쨌든 TRPG 기반 시스템의 경우 하나의 캐릭터는 기본적으로 종족과 직업에 의해 규정됩니다. 인간-전사, 엘프-성직자 등등..

RPG 캐릭터를 클래스로 구현한다고 했을때, 어설픈 객체 지향 방법론을 사용한다면 추상 캐릭터 클래스를 기반으로 하고 그것으로부터 인간 클래스, 엘프 클래스, 드워프 클래스 등등등을 파생시킬 생각을 할 수 있겠죠. 그런 다음에 할 일은.. 각 종족마다 직업 클래스들을 파생시키는 것... 여기서 뭔가 좀 꼬이기 시작합니다. 종족이 5개이고 직업이 5개이면 5*5, 총 25개의 파생 클래스들이 필요하다는 얘기가 되어 버리죠...

또한 만일 멀티 클래스 캐릭터를 구현한다면.. 예를 들어 인간 전투마법사를 구현한다면 인간 전사 클래스와 인간 마법사 클래스를 다중 상속한 파생 클래스가 되겠죠. 이런 식으로 나가면... 가능한 모든 인종-직업 조합 클래스들의 개수는 엄청나게 늘어납니다(개수를 알려면 수학의 조합 공식이 필요하겠죠..).

이것은 명백히 '설계' 상의 함정입니다. 코딩 문제가 아닌 것이죠..

무엇이 문제인가 - 인간이 직업에 따라 서로 다른 '종류'로서 분류된다는 가정이 잘못된 것입니다. 클래스의 상속은 상위 종류에 기반해서 더 세부적인 하위 '종류'들로 '분류'한다는 개념에 기반한 것입니다(클래스가 바로 '류'거든요). 예를 들어서 동물은 무척추 동물과 척추 동물로 분류되고, 척추 동물은 파충류-포유류- ... 등등등으로 분류되죠. 동물-척추 동물- 파충류는 명백한 부모-자식 관계이고, 따라서 상속으로 해결하는 것이 적합합니다.

전사는 인간의 한 종류인가.. 더 나아가서, 인간은 직업으로 '분류'될 수 있는가.. '아니다'라고 할 때 문제의 해결이 쉬워집니다. 예를 들어서 한 캐릭터는 싸울 때는 '전사'이지만 쉴 때는 한 아이의 '아빠'일 수도 있는 것이죠... '전사', '마법사', '아빠' 같은 것들은 종류라고 하기 보다는 캐릭터의 '배역(role)'이고, 그 배역은 수시로 바뀔 수도 있다고 간주하는 것이 훨씬 더 깔끔한 설계입니다. 즉 is-a 관계(전사는 인간의 일종이다)가 아니라 is-a-role-plyed-by 관계(전사는 인간이 수행하는 하나의 배역이다)인 것이죠..

더 나아가서 한 캐릭터가 동시에 여러 개의 배역들을 가질 수 있으며, 상황에 따라서는 하나의 배역이 다른 배역보다 우선할 수 있다..라고 가정한다면 멀티 클래스 캐릭터 문제가 해결됩니다.

예를 들어서 캐릭터마다 배역 목록이 있고, 캐릭터가 어떠한 이벤트를 거쳐서 도둑 길드에 가입하게 되었다면 캐릭터의 배역 목록에 '도둑'이라는 배역을 추가합니다. 어떠한 이벤트를 통해서 도둑 길드에서 쫓겨났다면 그 배역을 제거하구요. 또한 도둑-전사 캐릭터가 있을 때, 일대일 전투에서는 '전사'배역이 활성화되고 자물쇠를 열 때에는 '도둑' 배역이 활성화 되게 하는 방식도 가능하겠죠...

** 여기까지는 서론이고, 이제부터 본론...**

그런데 이러한 설계 상의 고민이 반드시 RPG 캐릭터 설계에서만 국한된 것은 아니고, 실제로 많은 응용 분야에서 이러한 문제들을 만나게 됩니다. 그래서 이미 이 문제에 대한 충분히 검증된 해답을 제시하는 '설계 패턴'이 나와 있습니다...

이 문제에 관련된 설계 패턴은 위임(delegation) 패턴입니다. 어떠한 공통의 기능을 공유하되 일부 기능은 다르게 만들고자 할 때 보통은 상속을 사용하지만, 위임은 다른 기능을 다른 어떤 함수나 클래스에 '위임'함으로써 클래스 상속의 필요성을 제거하는 방식입니다. 좀 더 자세한 내용은 <a href="http://pocom.konkuk.ac.kr/design_patter ... ation.html" target="_blank">이동훈님의 글</a>을 참고하시길..

결론적으로.. 하고싶은 이야기는... 설계 패턴이라는 것이 어떠한 이론상의 문제가 아니라 캐릭터 클래스 설계 같은 매우 실용적인 문제라는 점... 그리고 찾아보면 많은 문제들에 대한 해답과 유용한 경험들이 이미 나와 있다는 점...(인간이 매번 바퀴를 발명해야 했다면 지금만큼 발전하지 못했을 것이라는..)
<p><center>
/*************************
as simple as possible,
but not simpler
*************************/
</center>

<br></p></div>