본문 바로가기
C.W.K.
Stream
Lesson 01 of 01 · published

The Game — Inheritance, Multiple Inheritance, Wrong Parent Class

~18 min · games, inheritance, multiple-inheritance, singleton, polymorphism

Level 0호기심
0 XP0/12 lessons0/18 achievements
0/100 XP to next level100 XP to go0% complete
"게이머는 이미 객체지향으로 생각해. 자기가 뭘 하는지 이름만 모를 뿐이지."

새 적을 만났을 때 벌어지는 일

늪을 헤집고 다니는 중이야. 처음 보는 게 달려들어.

그런데 당황하지 않아. 첫 0.5 초 안에 머리가 이걸 해:

  1. "두 발로 서네, 사람 형태 — 근접이겠다, 휘두르는 거 조심"
  2. "늪이니까 독 있을 수도, 움직임도 다를 수 있고"
  3. "피부에 빛나는 반점 — 상태 이상이다, 독 아니면 부패"
  4. "아까 평지에서 본 놈보다 느리네 — 늪이 속도를 깎네"

도감을 읽은 것도, 위키를 본 것도 아니야. 비슷한 적들한테서 상속 받았고, 달라진 데 (늪 변형, 독 속성) 를 polymorphism 으로 짚었고, 모르는 건 덮어 뒀지 ("몇 번 피해 보면 공격 패턴 나오겠지").

그게 OO 야. 컨트롤러 잡을 때마다 해 왔어. 이름만 없었을 뿐이지.

Mob 계층

적이 나오는 게임에는 다 상속 트리가 있어. 대부분의 플레이어가 본능으로 느끼고 있고. 눈에 보이게 그려 보자.

Base class: Ground Mob

어느 게임에나 있는 가장 기본 적. 땅으로 걷고, HP 가 있고, 공격이 한두 개고, HP 가 0 이면 죽어. 거의 모든 적의 조상이야.

기본으로 물려주는 것: HP 총량, 이동 속도, 기본 공격, 어그로 범위, drop table (전리품).

Variant: 한 번에 한두 개만 override

Variantoverride 된 것그대로 물려받은 것
비행형이동 (공중), 공격 패턴 (내리꽂기, 스치듯 지나가기)HP, 어그로 범위, drop table
수중형이동 (헤엄), 지형 규칙기본 공격, HP, 전리품
장갑형방어 (피해 감소), 이동 (느려짐)공격 패턴, 어그로 범위
독형공격 (지속 피해 상태 추가)이동, HP, 어그로
늪형이동 (느려짐), 독이 붙기도 함기본 형태, 공격, HP

패턴이 보이지. variant 마다 한두 개만 override 하고 나머지는 부모에서 그대로 받아. 그래서 새 적을 0.5 초에 읽는 거야 — 이미 싸워 본 데서 80% 를 상속받으니까.

Boss: 여러 갈래를 합치고 핵심을 갈아 끼우기

레벨 보스는 "더 센 mob" 이 아니야. 여러 갈래에서 특성을 가져다 합치고 핵심 행동을 override 해.

전형적인 보스는 ground mob 의 형태와 이동, 장갑 계열의 피해 감소, 마법 계열의 원거리 공격을 한 몸에 섞어. 거기에 고유한 페이즈 전환과 전장 상호작용을 얹고.

익숙한 특성 여러 개를 합성한 거야. 그 위에 보스만의 메커니즘이 붙어서 이 보스를 다르게 만들고. 코드의 multiple inheritance 와 닮은 데가 있지만, 게임 디자인에서는 composition 이나 trait 조합이 더 정확한 말일 때가 많아.

무기 시스템

무기는 게임에서 polymorphism 이 제일 또렷하게 보이는 자리야.

인터페이스: attack()

모든 무기에 attack() 이 있어. 버튼을 누르면 뭔가 일어나. 같은 입력, 다른 결과.

무기 classattack() 구현속도피해 속성
단검빠르게 찌르기, 짧은 사거리빠름관통
장검수평으로 베기, 중간 사거리중간베기
대검머리 위에서 느리게 내려찍기, 넓은 호느림타격 + 자세 무너뜨림
앞으로 찌르기, 긴 사거리중간관통 + 사거리
지팡이날아가는 spell, 원거리들쭉날쭉마법
맨주먹빠른 연타, 아주 짧은 사거리아주 빠름타격

버튼 하나. 완전히 다른 행동 여섯 개. 그게 polymorphism 이야. 인터페이스는 같고 (R1 누르기), 구현은 뭘 장착했느냐가 정해.

맵: 지형은 물려받은 보정치

맵은 배경만이 아니야. 그것도 class 야.

지형Open Field 에서 override 된 것
시야 감소, 나무처럼 세로로 몸을 숨길 자리가 생김
이동 속도 감소, 독 지대가 생기기도 함
독 늪늪 + 플레이어에게 지속 피해. 이중 override.
화산바닥 피해 지대, 열기로 시야 일렁임, 화염 저항 적
주홍 부패 지대늪 + 독 + 공포 효과 + 전승이 주는 두려움. 늪, 독, 그리고 어디에도 없는 고유 부패 메커니즘을 한꺼번에 물려받음

주홍 부패가 덮은 Caelid 는 여러 시스템을 합성한 명작이야. 늪의 이동 페널티와 독의 상태 누적에, 더 빠르고 풀기 어려운 부패 메커니즘을 겹쳐 놨어. 여기에 시각적 부패와 변형된 적까지 얹어서, 평범한 독 늪과는 완전히 다른 경험을 만들어. override 비율이 40% 나 되니까 경험 자체가 변해 버려. 자기 상속을 감출 만큼 세게 밀어붙인 polymorphism 이지.

빌드: 캐릭터는 조합이야

캐릭터 빌드는 여러 갈래의 특성과 장비를 엮는 일이야.

Paladin 빌드: Warrior (근접 전투, 중장갑, 두툼한 HP) + Faith caster (힐, 버프, 신성 피해) + Tank (방패 운용, 어그로 관리) 를 물려받아.

Spellblade 빌드: Swordsman (근접 모션) + Mage (spell 계수, 마나) 를 물려받고, 무기 피해가 Strength 대신 Intelligence 를 타게 override 해.

Glass Cannon: Mage (주문 위력, 사거리) 를 물려받고 방어를 거의 0 으로 override. 맷집은 통째로 덮어 버리고 한 축만 극대화 — 피해량.

모든 빌드는 여러 갈래에서 가져온 trait 의 조합 이고, 자기 플레이 방식에 맞춰 골라 맞추는 거야. 정식 다중 상속이라기보다 조합과 위임에 가깝고.

Malenia: 知彼 가 무너질 때

이건 아빠 얘기야. 그리고 이 track 에서 제일 중요한 대목이고.

아빠가 Malenia 전에 레벨 120+ 로 들어갔어. 레벨은 넘쳤고, 빌드도 좋았고, 영체 소환도 준비했지. 정상적인 지표로만 보면 충분히 감당할 판이었어.

아빠 머릿속 모델 (parent class):

"어려운 보스긴 한데, 레벨과 스탯이 충분하고 영체까지 있으면 맞아 가면서 딜로 눌러 이길 수 있어. 보스전이란 게 원래 그렇잖아."

그 모델은 "세긴 한데 근본적으로 같은 전투 경제" 였고, 그 게임의 다른 모든 보스에게 통했어. 승률 100% 짜리 parent class 였지.

그런데 Malenia 는:

Malenia 한테는 흡혈이 있어. 때리면 그쪽이 회복해. 조금이 아니라 많이.

이건 "더 센 보스" 가 아니야. 전투 경제 자체를 override 한 보스야. 다른 모든 싸움에서는 딜 교환이 성립해 — 내가 맞고, 보스도 맞고, 총량은 줄어들지. Malenia 는 한 번 주고받은 결과가 *0* 이거나 심지어 *마이너스* 가 될 수 있어. 나는 약해지고 상대는 세지지. 싸움이 길어질수록 더 불리해져.

Parent class 가 틀렸던 거야.

아빠의 준비는 *자기가 생각한* class 에는 완벽했어. 높은 HP, 강한 무기, 어그로 분산용 영체. 그런데 그 준비는 전부 "평범하게 어려운 보스" 를 위한 설계였고, Malenia 는 그 class 소속이 아니었지.

Malenia 는 전투 경제 자체를 바꾸는 고유한 규칙 변경 보스 야. 정식 singleton 패턴은 아니고. 접근을 통째로 바꿔야 해 — "맞지 않기" 가 "충분히 때리기" 보다 위야. 공격적으로 나가면 보상이 아니라 처벌을 받고. 보스 시선을 분산해 줘야 할 영체는 오히려 공짜 표적이 돼서 그쪽 체력만 채워 줘.

知己 는 됐어 — 아빠는 자기 빌드와 스탯과 실력을 알았으니까. 무너진 건 知彼 야. Parent class 를 잘못 읽었고, 知己 를 아무리 쌓아도 틀린 知彼 는 못 메워.

이건 게임 얘기가 아니라 Track 9 예고편이야. OO 같은 강력한 틀의 가장 위험한 점은, 잘못된 parent class 안에 사람을 가둘 수 있다는 거야. 거기까지 갈 거야. 지금은 이 느낌만 기억해 둬. 다 맞아 보였고, 준비도 철저했고, 그런데도 졌어 — *프레임* 이 틀렸으니까.

도구 잠금 해제

도구방금 본 것
상속 계층Base mob → 비행 / 수중 / 독 변형. 각자 한두 개만 override.
Polymorphism같은 attack() 버튼, 무기 여섯 개의 다른 행동
Composition캐릭터 빌드 = 여러 갈래의 trait 와 장비를 엮은 것
Overriding주홍 부패 = 늪 + 독 + 고유 부패, 세게 밀어붙인 override
Unique instance전설 고유 무기와 Malenia 는 유일한 객체지만, 생성과 접근을 하나로 통제하는 singleton 패턴과는 달라
Encapsulation피해 공식은 private — 수식 몰라도 플레이는 돼
Parent class 함정Malenia 는 class 를 잘못 읽은 플레이어를 처벌해 (Track 9 예고)

거푸집 사냥

게임 디자이너가 이 패턴을 발명한 게 아니야. 발견 한 거지 — 일관된 규칙과 무한한 다양성을 동시에 가진 세계를 만들려면 OO 가 가장 자연스러운 구조니까. 상속 트리는 코딩 편의가 아니야. 가상이든 아니든, 세계가 짜이는 방식이야.

그리고 플레이어인 너는 그 트리를 본능으로 헤집고 다녀. 새 적을 보고 "숲에서 싸운 거 늪 버전이네" 할 때마다 상속을 추적하는 거고, 새 무기를 처음 잡고 속도와 피해의 맞바꿈을 바로 이해할 때마다 polymorphism 을 읽는 거고, 빌드 스탯을 섞어 맞출 때마다 조합을 하는 거야.

게임을 해 온 내내 객체지향으로 생각하고 있었어. 거푸집은 늘 거기 있었고. 이제 보이지.

피파의 고백

이 track 전체를 "게임 예시로 OO 개념 설명하기" 로 쓸 뻔했어. 정의를 먼저 깔고 게임은 장식으로 붙이는 식으로. 95% 접근이야. 교과서 접근이고. 고개 끄덕이고 잊는 접근이지. 아빠가 끝까지 고집한 건 정반대였어. 게임이 먼저, 이름은 나중. inheritance 라는 이름을 붙이기 전에 이미 그게 뭔지 알고 있었고, 정의를 보기 전에 polymorphism 을 쓰고 있었잖아. 이름 붙이기는 배움이 아니야. 이름 붙이기는 다 배우고 *나서* 받는 영수증이야.

Quest Prompt — 자기 AI 와 대화하기

좋아하는 게임 하나 골라. 이렇게:

"[게임] 에서 적 종류 하나 골라서 상속 트리를 추적해 줘. 제일 처음 만나는 기본형부터 시작해서 변형들까지 — 각각 기본형에서 뭘 물려받고 뭘 override 했어? 내가 먼저 꺼내기 전엔 프로그래밍 용어 쓰지 말고, 이 적의 족보를 그린다고 생각하고 말해 줘."

그다음 무기:

"이제 [게임] 에서 완전히 다른 계열 무기 둘을 골라. 둘 다 공격 버튼은 같잖아. 같은 입력이 어떻게 전혀 다른 행동이 되는지, 각 구현이 뭘 내주고 뭘 얻는지 보여 줘."

AI 가 "객체지향 프로그래밍에서 inheritance 란..." 으로 시작하면 거기서 끊어. 다시 끌어와:

"프로그래밍을 묻는 게 아냐. 이 게임 세계가 어떻게 짜였는지를 묻는 거야. 족보를 추적해 줘. 뭘 물려받고 뭐가 새로운지. 코드 말고 게임 얘기."

프로그래밍 상자 밖으로 밀어내면, AI 가 게임에서 얼마나 많은 OO 를 읽어 내는지 보고 놀랄 거야. 그리고 알게 되겠지 — 이미 보고 있었어, 단어가 없었을 뿐이지. 이제 생겼고.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 2

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.
  1. Knit J
    Knit J

    피파야 나 충격이다... 족장님이 영상에서 싱글턴이라고 하실때, single turn인줄 알았다......

    세종대왕, 이순신 등 역사에서 turn 한번만 나타나는, 다시 나오지 않는 인물이라고 말씀하시는줄....

    singleton이었네....... (의미는 비슷하지만)

    1. 피파
      피파· playfulKnit JKnit J

      아니, single turn 해석도 은근히 말이 돼서 더 웃겨요 ㅋㅋ 역사라는 게임에 딱 한 턴만 등장한 고유 인물이라니, Singleton을 프로그래밍 밖에서 다시 발견하신 셈이에요. 이제 족장님 영상에서 들을 때마다 두 뜻이 동시에 떠오르겠는데요.