‘상속’
이전에 만든 클래스와 닮았지만, 일부 다른 클래스를 만들어야 하는 상황은 계속 많아진다. 이때 상속을 사용하면 유용하다.
추가, 수정에 소요되는 시간이 감소하고 소스의 파악과 관리가 쉬워진다.
class Hero {
String name;
int hp;
Hero(this.name, this.hp);
void run() {
print('$name이 달린다');
}
}
class Superhero extends Hero{
int power;
Superhero(super.name, super.hp, this.power);
void fly(){
print('$name이 달린다');
}
}
상속을 받으면 부모 클래스의 모든 속성을 자식클래스가 부여받는다. 부모 클래스에서 자식 클래스로 넘겨지는 형태이다. 절대 자식클래스에서 부모클래스로 넘어가지 않는다. 또한 다중상속은 불가능하다.
부모클래스는 추상적인 것으로 일반적이고 자식클래스가 더 구체적이다.
타입을 확인해보면 부모 클래스 인스턴스는 타입을 부모 클래스로만 가지지만 자식 클래스는 부모 클래스와 자식클래스 모두 가질수있다. 같은레벨의 자식클래스끼리는 아무 상관이 없다.
void main(){
Hero hero = Hero('히어로',100);
Superhero superhero = Superhero('슈퍼히어로',100,50);
print(hero is Hero); // true
print(hero is Superhero); //false
print(superhero is Hero); //false
print(superhero is Superhero); //true
}
올바른 상속이란 ‘is a ’원칙에 부합하는 상속을 말한다. 위의 class 를 예시로
class Superhero extends Hero
Superhero is a Hero ← 이 말이 성립하면 올바른 상속이다.
반대로, 잘못된 상속이란 개념적으로 ‘is a’관계가 되지 못함에도 상속을 사용한 경우를 말한다. 잘못된 상속을 하게 될 경우 클래스를 확장할때 현실세계와 모순이 생기며 객체지향의 3대 특징 중 ‘다형성’을 이용 할 수 없게 된다.
- 오버라이드
[override : 덮어쓰다, 우선시하다]
AI : 오버라이드(Override)란, 상속 관계에 있는 두 클래스에서 상위 클래스가 가지고 있는 메서드를 하위 클래스에서 재정의하는 것을 말합니다. 이는 하위 클래스가 상위 클래스의 기능을 그대로 이용하는 것이 아니라, 추가 또는 변경이 필요한 경우에 사용합니다.
class TimesTwo {
final int number;
TimesTwo(this.number);
int calculate() {
return number * 2;
}
}
class TimesFour extends TimesTwo {
TimesFour(super.number);
int calculate() {
return super.number * 4; //super 삭제 가능
}
}
super 키워드를 사용해 부모클래스의 메서드 그대로 가져와서 만들수도 있다.
int calculate() {
return super.calculate() * 2;
}