객체지향 프로그래밍(OOP)은 프로그램을 '객체'라는 단위로 나눠 만드는 방법입니다. 게임은 캐릭터, 몬스터, 아이템처럼 눈에 보이는 대상이 많아 객체지향으로 설명하기 좋은 분야입니다. 이 글에서는 객체지향의 네 가지 특징과 게임 개발에서 주의할 점을 정리합니다.
절차지향과 무엇이 다른가
절차지향은 '무엇을 어떤 순서로 할지'를 중심으로 코드를 씁니다. 객체지향은 '누가 무엇을 하는지'를 중심으로 씁니다. 몬스터가 공격한다면 공격 함수 하나가 모든 몬스터를 처리하는 대신, 각 몬스터 객체가 자기 공격 방법을 갖고 있는 식입니다.
코드가 작을 때는 차이가 크지 않지만, 몬스터 종류가 수십 가지로 늘어나면 객체지향 방식이 수정과 확장에 유리해집니다.
객체지향은 언어 기능이라기보다 생각하는 방식에 가깝습니다. C++, C#, 자바처럼 객체지향 문법을 갖춘 언어에서 쓰기 편할 뿐, 같은 원리를 다른 언어에서도 흉내 낼 수 있습니다.
네 가지 핵심 특징
| 특징 | 뜻 | 게임 예시 |
|---|---|---|
| 캡슐화 | 데이터와 기능을 묶고 내부를 숨김 | 체력은 TakeDamage()로만 줄일 수 있게 함 |
| 상속 | 공통 기능을 부모에게 두고 자식이 물려받음 | Enemy를 물려받은 Goblin, Orc |
| 다형성 | 같은 명령에 객체마다 다르게 반응 | Attack()을 부르면 근접·원거리가 각자 공격 |
| 추상화 | 공통 개념만 뽑아 틀을 정함 | 모든 아이템은 Use()를 가진다고 약속 |
캡슐화는 버그를 줄이는 데 특히 효과적입니다. 체력 변수를 아무 곳에서나 바꿀 수 있으면 누가 언제 바꿨는지 찾기 어렵지만, 정해진 함수로만 바꾸게 하면 그 함수 하나만 살펴보면 됩니다.
추상화와 다형성은 함께 쓰일 때 힘을 발휘합니다. '모든 적은 공격할 수 있다'는 틀을 정해 두면, 새 몬스터를 추가할 때 기존 전투 코드를 건드리지 않고 새 클래스만 만들면 됩니다.
상속을 많이 쓰면 생기는 문제
상속은 편리하지만 깊어지면 곤란해집니다. 예를 들어 '날아다니는 몬스터'와 '헤엄치는 몬스터'를 상속으로 나눴는데, 날면서 헤엄치는 몬스터가 필요해지면 구조가 꼬입니다. 부모 클래스를 고치면 아래 모든 자식이 영향을 받는 것도 부담입니다.
그래서 '상속보다 조합(Composition)'이라는 원칙이 자주 언급됩니다. 기능을 작은 부품으로 나눠 필요한 것만 붙이는 방식입니다.
게임 엔진의 컴포넌트 방식
유니티와 언리얼은 모두 컴포넌트 방식을 적극적으로 씁니다. 게임 오브젝트는 빈 그릇이고, 여기에 이동, 체력, 공격, 충돌 같은 컴포넌트를 붙여 동작을 만듭니다. 날면서 헤엄치는 몬스터는 비행 컴포넌트와 수영 컴포넌트를 모두 붙이면 됩니다.
- 장점: 기능을 자유롭게 섞을 수 있고, 하나를 고쳐도 다른 기능에 영향이 적음
- 주의: 컴포넌트끼리 서로를 너무 많이 참조하면 다시 얽히게 됨
- 팁: 컴포넌트 사이 연락은 이벤트나 인터페이스로 느슨하게 연결
좋은 객체 설계를 위한 습관
- 클래스 하나는 한 가지 책임만 갖게 합니다.
- 변수는 기본적으로 숨기고, 필요한 기능만 함수로 열어 둡니다.
- 공통 약속은 인터페이스나 추상 클래스로 정합니다.
- 이름만 보고 역할을 알 수 있게 짓습니다.
이런 원칙은 흔히 SOLID라는 다섯 가지 설계 원칙으로 정리되어 있습니다. 처음부터 모두 지키려 하기보다, 코드를 고칠 때 불편했던 지점을 되돌아보며 하나씩 적용해 보는 것이 이해에 도움이 됩니다.
연습과 학습 경로
간단한 RPG 전투를 만들어 보며 플레이어, 몬스터, 아이템을 클래스로 나눠 보세요. 그다음 같은 기능을 컴포넌트 방식으로 다시 짜 보면 두 방식의 차이가 몸으로 느껴집니다.
면접에서는 네 가지 특징의 정의보다 '직접 만든 코드에서 어떻게 썼는가'를 묻는 경우가 많습니다. 프로젝트를 하면서 클래스를 나눈 이유, 상속 대신 조합을 고른 이유를 메모해 두면 답변 재료가 됩니다.
SBS아카데미게임학원 게임프로그래밍 과정은 첫 단계에서 객체지향 프로그래밍의 기초와 고급 개념을 다루고 이후 엔진 실습으로 넘어갑니다.
자주 묻는 질문
객체지향은 꼭 알아야 하나요?
게임 엔진과 대부분의 게임 코드가 객체지향을 바탕으로 하므로 기본 개념은 반드시 알아야 합니다. 면접에서도 자주 묻는 주제입니다.
ECS라는 말도 들었는데 객체지향과 다른가요?
ECS(엔티티·컴포넌트·시스템)는 데이터와 처리를 분리해 대량의 객체를 빠르게 처리하려는 방식입니다. 객체지향을 먼저 이해한 뒤 비교해 보면 차이를 알기 쉽습니다.
