객체 지향(Object-Oriented Programming, OOP)은 프로그램을 "객체들 간의 상호작용"으로 구성하는 방식이다. 이를 소설에 비유하면 다음과 같다:
확장에는 열려 있고, 변경에는 닫혀 있어야 한다.
새로운 인물(예: Necromancer)을 추가할 때 기존 코드(이야기 흐름)를 수정하지 않고도 기능을 확장할 수 있어야 한다.
class Character {
void attack(); // 각 인물이 구현
}
class Knight extends Character {
void attack() { System.out.println("칼 휘두르기!"); }
}
class Necromancer extends Character {
void attack() { System.out.println("언데드 소환!"); }
}
등장인물들이 서로 대화하는 모습은 객체지향에서 객체 간 메시지 전달(message passing) 개념에 해당한다. 객체는 서로의 내부 구현을 몰라도, 메시지를 주고받으며 협력할 수 있다.
class King {
void command(Knight knight) {
knight.guardGate();
}
}
class Knight {
void guardGate() {
System.out.println("성문을 지키러 갑니다!");
}
}
이러한 메시지 전달 구조는 캡슐화, 책임 분리, 낮은 결합도를 가능하게 한다.
castSpell()은 마법사의 전형적인 행동, speak()는 캐릭터의 철학이나 말투class Wizard {
void castSpell() { System.out.println("불꽃 마법 시전!"); }
void speak() { System.out.println("진정한 마법은 내면에서 비롯되지."); }
}
인터페이스는 "이런 행동을 할 수 있는 인물이어야 한다"는 **공통된 규칙(설계서)**이다.
interface Warrior {
void attack();
void defend();
}
class Knight implements Warrior {
public void attack() { System.out.println("칼로 공격!"); }
public void defend() { System.out.println("방패로 막기!"); }
}
이 구조 덕분에 Warrior 타입으로 여러 인물을 다형성 있게 처리할 수 있으며, 확장성과 유연성을 크게 높일 수 있다.