이번 포스팅에서는 상속에 대해서 다루겠습니다. 저번 포스팅까지 2개 연속 class에 대한 포스팅이었는데요. 사실 이번 포스팅도 class포스팅에 연장선이라고 할 수 있습니다.
상속이란 무엇인가요?? 부모가 자식에게 유산을 물려주는 것을 상속이라고 합니다. 이제 포스팅할 상속이란 비슷한 의미입니다. 게임을 예로 설명해볼게요. 그 중에서도 RPG게임을 예로, 큰 범주에서 플레이어, 몬스터, NPC가 있습니다. 그리고 그 중 몬스터는 여러종류의 몬스터가 있겠지요?? 그리고 나머지 두 종류도 다양합니다. 플레이어는 전사, 마법사, 도적 등등 NPC는 상인, 주민 여러가지가 있습니다. 그 중 몬스터를 dart언어로 표현해보겠습니다.
void main() {
MonsterA monster = MonsterA();
monster.attack();
}
class MonsterA {
void attack() {
print("주먹날리기");
}
}
class MonsterB {
void attack() {
print("대포 쏘기");
}
}
>> 주먹날리기
MonsterA, MonsterB는 몬스터들입니다. 두 녀석 모두 attack이라는 메소드를 가지고 있습니다. 여기서 보면 알 수 있듯이, 두 놈 모두 몬스터라는 공통점에다가 동일한 메소드를 가지고 있군요. 물론 메소드의 실행문을 다르지만요. 이러한 몬스터 클래스가 계속 늘어나게 된다면, 동일한 코드를 계속 치게 됩니다. 생산성이 매우 안좋아지는 것이죠. 이런 부분을 상속을 이용해서 굉장히 가독성있고, 간단하게 표현할 수 있습니다.
void main() {
A a1 = A();
B b1 = B();
Monster a2 = A(); //슈퍼 클래스로도 선언 가능함.
Monster b2 = B();
a1.attack();
b1.attack();
a2.attack();
b2.attack();
}
abstract class Monster {
void attack() {
print('공격!!');
}
}
class A extends Monster {
}
class B extends Monster {
}
>> 공격!!
>> 공격!!
>> 공격!!
>> 공격!!
위 예시를 보면, Monster라는 추상 클래스를 하나 생성해서, 그 클래스의 메소드로 attack()을 선언하였고, A와 B클래스는 각각 Monster 클래스를 extends하고 있습니다. 이를 상속이라고 합니다. 여기서, 부모의 역활을 하는 Monster클래스는 슈퍼 클래스, 자식들인 A, B는 서브 클래스라고 합니다. 슈퍼 클래스를 상속받은 서브 클래스는 슈퍼 클래스의 모든 것을 사용할 수 있습니다. 그리고 선언하는 방식을 보았을 때, 슈퍼 클래스로 선언하여, 서브 클래스로 분류가 가능한 것을 알 수 있습니다.
맨 처음의 MonsterA, B는 각각 attack메소드는 동일했지만, 실행코드가 달랐습니다. 이 때, 오버라이딩을 이용해서 슈퍼 클래스에서 상속받은 메소드를 재정의할 수 있습니다.
void main() {
A a1 = A();
B b1 = B();
Monster a2 = A(); //슈퍼 클래스로도 선언 가능함.
Monster b2 = B();
a1.attack();
b1.attack();
a2.attack();
b2.attack();
}
abstract class Monster {
void attack() {
print('공격!!');
}
}
class A extends Monster {
void attack() {
print('주먹날리기');
}
}
class B extends Monster {
void attack() {
print('대포 쏘기');
}
}
>> 주먹날리기
>> 대포쏘기
>> 주먹날리기
>> 대포쏘기