inheritance, override

Kim Da HEE·2023년 12월 5일
0

Dart 언어

목록 보기
7/11

‘상속’

이전에 만든 클래스와 닮았지만, 일부 다른 클래스를 만들어야 하는 상황은 계속 많아진다. 이때 상속을 사용하면 유용하다.

추가, 수정에 소요되는 시간이 감소하고 소스의 파악과 관리가 쉬워진다.

  • Hero 클래스
class Hero {
  String name;
  int hp;

  Hero(this.name, this.hp);

  void run() {
    print('$name이 달린다');
  }
}
  • Superhero 클래스 : Hero 클래스를 상속받고 int power이 추가 되어 작성되었다.
  • fly 메서드가 추가되었다.
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;
}

0개의 댓글