상속 ( inheritance )

nouveau·2023년 12월 5일
0

상속이란?

유사한 구현을 유지하면서 다른 객체 또는 클래스로 확장하는 것,
또는 상위 클래스의 멤버를 하위 클래스로 내려주는 것.

  • “이전에 만든 클래스와 닮았지만, 일부 다른 클래스”를 만들 필요가 있을 경우가 늘어날 것이다.
    => 반복작업 또는 불필요한 작업을 줄이기 위한 ‘재사용성’에 대한 해결책
class Person {
  String name;
  int age;
    
  Person(this.name, this.age);
}
    
class Korean extends Person {
  String nation = 'Korea';
  
  Korean(super.name, super.age);
}
    
class American extends Person {
  String nation = 'America';
    
  American(super.name, super.age);
}
    
void main() {
  Korean yongyeon = Korean('yongyeon', 20);
  print('${yongyeon.name} | ${yongyeon.age} | ${yongyeon.nation}');
}

올바른 상속

올바른 상속은 “is-a 원칙” 이라고 하는 규칙에 따른 상속을 말한다.

class Korean extends Person

=> Korean is a Person ( Korean은 Person의 한 종류이다. )

다중상속???

Dart에서 다중상속은 금지 돼 있으나 Mixin 으로 구현 가능하다.

“Mixin은 여러 클래스 계층에서 클래스 코드를 재사용하는 방법이다.”
=> 공식문서 : https://dart-ko.dev/language/mixins

  • 상속과 상관없는 별도의 확장을 위해 사용하며,
    상속과는 다르게 여러개를 선언 할 수 있고, 부모/자식 클래스 계층에 상관 없이 사용 할 수 있다.
mixin Cheese {
  
}
    
mixin Pepperoni {
    
}
    
abstract class Pizza with Cheese {
     
}
    
class PepperoniPizza extends Pizza with Pepperoni {
      
}
    
class CheesePizza extends Pizza {
     
}
  • 구체화와 일반화의 관계

    자식클래스 일 수록 구체화 되고,
    부모 클래스 일 수록 추상적인 것으로
    일반화 된다.

정리

상속의 기초

  • extends를 사용하여 기존 클래스를 기초로 하는 새로운 클래스를 정의 할 수 있다
  • 부모 클래스의 멤버는 자동적으로 자식 클래스에 상속되므로, 자식 클래스에는 추가 된 부분만 기술 하면 된다
  • 부모 클래스에 있는 메소드를, 자식 클래스에서 재작성 할 경우 이것을 오버라이드 한다고 한다
  • 올바른 상속이란 “자식 클래스 is-a 부모 클래스"
  • 상속에는 “추상적, 구체적" 관계에 있다는 것을 정의하는 역할도 있음

인스턴스

  • 인스턴스는 내부에 부모클래스의 인스턴스를 가지는 다중구조를 가진다
  • 보다 외측의 인스턴스에 속하는 메소드가 우선적으로 동작한다
  • 외측의 인스턴스에 속하는 메소드는 super 을 사용하여 내측 인스턴스의 멤버에 접근할 수 있다

생성자 동작

  • 다중구조의 인스턴스가 생성되는데, 자동적으로 가장 외측 인스턴스의 생성자가 호출 됨
  • 모든 생성자는, “부모 인스턴스의 생성자"를 호출 할 필요가 있다

0개의 댓글