예제의 주인공 Joe는 “SimUDuck”이라는 오리 연못 시뮬레이션 게임을 개발 중.
이 게임은 다양한 오리 종을 화면에 보여주고, 수영하고, 꽥꽥 소리도 낸다.
초기 설계는 단순한 상속 기반 객체지향(OOP) 구조:
Duck이라는 슈퍼클래스(부모 클래스)
quack(), swim())은 여기서 구현display())은 추상 메서드로 정의 후 서브클래스가 구현class Duck {
quack();
swim();
display(); // 추상 메소드
}
class MallardDuck extends Duck {
display() { /* looks like a mallard */ }
}
class RedheadDuck extends Duck {
display() { /* looks like a redhead */ }
}
classDiagram
class Duck {
<<abstract>>
+quack()
+swim()
+display() // abstract (구현은 하위 클래스에서)
}
class MallardDuck {
display()
}
class RedheadDuck {
display()
}
Duck <|-- MallardDuck
Duck <|-- RedheadDuck
여기까지는 깔끔한 **상속 구조.
공통 부분은 상위, 다른 부분은 하위에서 재정의 → 교과서적 OOP 방식
“ I just need to add a fly() method in the Duck class and then all the ducks will inherit it. Now’s my time to really show my true OO genius.”
class Duck {
quack();
swim();
display();
fly(); // 새로 추가
}
MallardDuck, RedheadDuck 등)는 자동으로 fly()를 상속RubberDuck)도 날아버림!fly()가 부모 클래스에 들어가면서 모든 자식 클래스가 강제로 날개 달린 오리가 된 것.classDiagram
direction TB
class Duck {
+quack()
+swim()
+display()
+fly()
}
class MallardDuck {
+display()
}
class RedheadDuck {
+display()
}
class RubberDuck {
+quack() // overridden to Squeak
+display()
}
Duck <|-- MallardDuck
Duck <|-- RedheadDuck
Duck <|-- RubberDuck
%% Notes (use "\\n" for line breaks)
note for Duck "fly()가 부모 클래스에"
note for RubberDuck "고무 오리라서 quack()은 '삑'(Squeak) 소리로 오버라이드"