규모가 커질수록 중요한 건 “코드가 길어지는 것” 자체가 아니라,
입니다.
┌─────────────────────────────────────────────────────────────────────────────────────────────┐
│ 절차 지향 (Procedural) │ 객체 지향 (OOP) │
├───────────────────────────────────────────┼─────────────────────────────────────────────────┤
│ [데이터] [로직] │ [객체] │
│ Knight ←──── HealMe() │ Knight { │
│ 구조체 외부 함수 │ _hp, _attack, _defence ← 데이터 │
│ (분리) (타입별로 각각 필요) │ HealMe(), Attack() ← 로직 │
│ │ } (한 덩어리) │
│ • HealMe(Knight*) → Knight만 │ • k1.HealMe(10) → 객체가 스스로 │
│ • HealMe(Archer*) → Archer용 별도 │ • 모든 타입이 동일 인터페이스 │
│ • Fight(K*,K*) → 3×3=9개 함수 폭발 │ • Fight(Player*, Player*) 하나로 │
└─────────────────────────────────────────────────────────────────────────────────────────────┘
핵심 문제(규모가 커질 때):
struct Knight {
int hp;
int attack;
int defence;
};
void HealMe(Knight& k, int value) {
k.hp += value;
}
학습 초반엔 이해가 쉽지만, 종류/규칙이 늘어날수록 “관리 책임”이 분산되어 유지보수 비용이 커지기 쉽습니다.
객체 지향의 핵심은 단순합니다.
예를 들어 “기사”는 HP/공격력 같은 데이터만 있는 게 아니라,
“회복/공격/피해/죽음 판정” 같은 규칙도 함께 묶여야 관리가 쉬워집니다.
class Knight {
public:
void HealMe(int value) { _hp += value; } // (학습용) 이후엔 clamp 같은 규칙을 넣게 됨
int _hp;
int _attack;
int _defence;
};
결론: 객체는 자신만의 상태와 행동을 함께 가지며, “관리 책임”을 객체 내부로 모으는 방향으로 설계가 바뀝니다.