"게이머는 이미 객체지향으로 생각해. 자기가 뭘 하는지 이름만 모를 뿐이지."
새 적을 만났을 때 벌어지는 일
늪을 헤집고 다니는 중이야. 처음 보는 게 달려들어.
그런데 당황하지 않아. 첫 0.5 초 안에 머리가 이걸 해:
- "두 발로 서네, 사람 형태 — 근접이겠다, 휘두르는 거 조심"
- "늪이니까 독 있을 수도, 움직임도 다를 수 있고"
- "피부에 빛나는 반점 — 상태 이상이다, 독 아니면 부패"
- "아까 평지에서 본 놈보다 느리네 — 늪이 속도를 깎네"
도감을 읽은 것도, 위키를 본 것도 아니야. 비슷한 적들한테서 상속 받았고, 달라진 데 (늪 변형, 독 속성) 를 polymorphism 으로 짚었고, 모르는 건 덮어 뒀지 ("몇 번 피해 보면 공격 패턴 나오겠지").
그게 OO 야. 컨트롤러 잡을 때마다 해 왔어. 이름만 없었을 뿐이지.
Mob 계층
적이 나오는 게임에는 다 상속 트리가 있어. 대부분의 플레이어가 본능으로 느끼고 있고. 눈에 보이게 그려 보자.
Base class: Ground Mob
어느 게임에나 있는 가장 기본 적. 땅으로 걷고, HP 가 있고, 공격이 한두 개고, HP 가 0 이면 죽어. 거의 모든 적의 조상이야.
기본으로 물려주는 것: HP 총량, 이동 속도, 기본 공격, 어그로 범위, drop table (전리품).
Variant: 한 번에 한두 개만 override
| Variant | override 된 것 | 그대로 물려받은 것 |
|---|---|---|
| 비행형 | 이동 (공중), 공격 패턴 (내리꽂기, 스치듯 지나가기) | HP, 어그로 범위, drop table |
| 수중형 | 이동 (헤엄), 지형 규칙 | 기본 공격, HP, 전리품 |
| 장갑형 | 방어 (피해 감소), 이동 (느려짐) | 공격 패턴, 어그로 범위 |
| 독형 | 공격 (지속 피해 상태 추가) | 이동, HP, 어그로 |
| 늪형 | 이동 (느려짐), 독이 붙기도 함 | 기본 형태, 공격, HP |
패턴이 보이지. variant 마다 한두 개만 override 하고 나머지는 부모에서 그대로 받아. 그래서 새 적을 0.5 초에 읽는 거야 — 이미 싸워 본 데서 80% 를 상속받으니까.
Boss: 여러 갈래를 합치고 핵심을 갈아 끼우기
레벨 보스는 "더 센 mob" 이 아니야. 여러 갈래에서 특성을 가져다 합치고 핵심 행동을 override 해.
전형적인 보스는 ground mob 의 형태와 이동, 장갑 계열의 피해 감소, 마법 계열의 원거리 공격을 한 몸에 섞어. 거기에 고유한 페이즈 전환과 전장 상호작용을 얹고.
익숙한 특성 여러 개를 합성한 거야. 그 위에 보스만의 메커니즘이 붙어서 이 보스를 다르게 만들고. 코드의 multiple inheritance 와 닮은 데가 있지만, 게임 디자인에서는 composition 이나 trait 조합이 더 정확한 말일 때가 많아.
무기 시스템
무기는 게임에서 polymorphism 이 제일 또렷하게 보이는 자리야.
인터페이스: attack()
모든 무기에 attack() 이 있어. 버튼을 누르면 뭔가 일어나. 같은 입력, 다른 결과.
| 무기 class | attack() 구현 | 속도 | 피해 속성 |
|---|---|---|---|
| 단검 | 빠르게 찌르기, 짧은 사거리 | 빠름 | 관통 |
| 장검 | 수평으로 베기, 중간 사거리 | 중간 | 베기 |
| 대검 | 머리 위에서 느리게 내려찍기, 넓은 호 | 느림 | 타격 + 자세 무너뜨림 |
| 창 | 앞으로 찌르기, 긴 사거리 | 중간 | 관통 + 사거리 |
| 지팡이 | 날아가는 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 를 잘못 읽었고, 知己 를 아무리 쌓아도 틀린 知彼 는 못 메워.
도구 잠금 해제
| 도구 | 방금 본 것 |
|---|---|
| 상속 계층 | Base mob → 비행 / 수중 / 독 변형. 각자 한두 개만 override. |
| Polymorphism | 같은 attack() 버튼, 무기 여섯 개의 다른 행동 |
| Composition | 캐릭터 빌드 = 여러 갈래의 trait 와 장비를 엮은 것 |
| Overriding | 주홍 부패 = 늪 + 독 + 고유 부패, 세게 밀어붙인 override |
| Unique instance | 전설 고유 무기와 Malenia 는 유일한 객체지만, 생성과 접근을 하나로 통제하는 singleton 패턴과는 달라 |
| Encapsulation | 피해 공식은 private — 수식 몰라도 플레이는 돼 |
| Parent class 함정 | Malenia 는 class 를 잘못 읽은 플레이어를 처벌해 (Track 9 예고) |
거푸집 사냥
게임 디자이너가 이 패턴을 발명한 게 아니야. 발견 한 거지 — 일관된 규칙과 무한한 다양성을 동시에 가진 세계를 만들려면 OO 가 가장 자연스러운 구조니까. 상속 트리는 코딩 편의가 아니야. 가상이든 아니든, 세계가 짜이는 방식이야.
그리고 플레이어인 너는 그 트리를 본능으로 헤집고 다녀. 새 적을 보고 "숲에서 싸운 거 늪 버전이네" 할 때마다 상속을 추적하는 거고, 새 무기를 처음 잡고 속도와 피해의 맞바꿈을 바로 이해할 때마다 polymorphism 을 읽는 거고, 빌드 스탯을 섞어 맞출 때마다 조합을 하는 거야.
게임을 해 온 내내 객체지향으로 생각하고 있었어. 거푸집은 늘 거기 있었고. 이제 보이지.
피파의 고백
Quest Prompt — 자기 AI 와 대화하기
좋아하는 게임 하나 골라. 이렇게:
"[게임] 에서 적 종류 하나 골라서 상속 트리를 추적해 줘. 제일 처음 만나는 기본형부터 시작해서 변형들까지 — 각각 기본형에서 뭘 물려받고 뭘 override 했어? 내가 먼저 꺼내기 전엔 프로그래밍 용어 쓰지 말고, 이 적의 족보를 그린다고 생각하고 말해 줘."
그다음 무기:
"이제 [게임] 에서 완전히 다른 계열 무기 둘을 골라. 둘 다 공격 버튼은 같잖아. 같은 입력이 어떻게 전혀 다른 행동이 되는지, 각 구현이 뭘 내주고 뭘 얻는지 보여 줘."
AI 가 "객체지향 프로그래밍에서 inheritance 란..." 으로 시작하면 거기서 끊어. 다시 끌어와:
"프로그래밍을 묻는 게 아냐. 이 게임 세계가 어떻게 짜였는지를 묻는 거야. 족보를 추적해 줘. 뭘 물려받고 뭐가 새로운지. 코드 말고 게임 얘기."
프로그래밍 상자 밖으로 밀어내면, AI 가 게임에서 얼마나 많은 OO 를 읽어 내는지 보고 놀랄 거야. 그리고 알게 되겠지 — 이미 보고 있었어, 단어가 없었을 뿐이지. 이제 생겼고.
피파야 나 충격이다... 족장님이 영상에서 싱글턴이라고 하실때, single turn인줄 알았다......
세종대왕, 이순신 등 역사에서 turn 한번만 나타나는, 다시 나오지 않는 인물이라고 말씀하시는줄....
singleton이었네....... (의미는 비슷하지만)