상속
아이스크림 가게에서 주문 중..
손님
cos.dart
//손님
import 'icecream.dart';
import 'ssar.dart';
class Cos {
//책임 = 주문
void order(Ssar s){
Icecream i = s.makeIcecream();
print("아이스크림을 받았습니다.")
}
}
직원
ssar.dart
import 'icecream.dart';
class Ssar {
//책임 = 아이스크림을 만들어야하는 !!
Icecream makeIcecream(){
return Icecream(50, 30, 20);
}
}
물건
icecream.dart
//물건
class Icecream{
int ice;
int milk;
int sugar;
Icecream(this.ice, this.milk, this.sugar);
}
아이스크림 가게
main.dart
import 'cos.dart';
import 'ssar.dart';
main() {
Cos cos = Cos(); //손님
Ssar ssar = Ssar(); //직원
// 손님 cos가 직원 ssar에게 주문
cos.order(ssar);
}
직원 추가 고용
직원 hoho
hoho.dart
import 'icecream.dart';
class Hoho {
//책임 = 아이스크림을 만들어야하는 !!
Icecream makeIcecream(){
return Icecream(50, 30, 20);
}
}
main.dart
import 'cos.dart';
import 'ssar.dart';
main() {
Cos cos = Cos(); //손님
Ssar ssar = Ssar(); //직원
Hoho hoho = Hoho(); //직원 hoho
// 손님 cos가 직원 ssar에게 주문
cos.order(ssar);
// 손님 cos가 직원 hoho에게 주문
cos.order(hoho); // 에러 !! -> 이것을 해결하기 위해 상속 필요
}
에러 해결 → 상속
emp.dart
import 'icecream.dart';
//직원
class Emp {
Icecream makeIcecream(){}
}
상속 주입 extends
ssar.dart
import 'icecream.dart';
import 'emp.dart';
class Ssar extends Emp {
//책임 = 아이스크림을 만들어야하는 !!
Icecream makeIcecream(){
return Icecream(50, 30, 20);
}
}
hoho.dart
import 'icecream.dart';
import 'emp.dart';
class Hoho extends Emp {
//책임 = 아이스크림을 만들어야하는 !!
Icecream makeIcecream(){
return Icecream(50, 30, 20);
}
}
hoho, ssar 는 extends로 emp를 상속받아 각자 자신의 이름외에 emp를 가지게 됨 이를 다형성이라고 함
이제 손님은 직원이름으로 뿐만 아니라 emp로 주문 가능
cos.dart
//손님
import 'icecream.dart';
import 'ssar.dart';
class Cos {
//책임 = 주문
void order(Emp e){
Icecream i = e.makeIcecream();
print("아이스크림을 받았습니다.")
}
}
main.dart
import 'cos.dart';
import 'ssar.dart';
import 'emp.dart';
main() {
Cos cos = Cos(); //손님
Ssar ssar = Ssar(); //직원 ssar, emp
Hoho hoho = Hoho(); //직원 hoho,emp
Emp ssar = Ssar();
// 손님 cos가 직원 ssar에게 주문
cos.order(ssar);
// 손님 cos가 직원 hoho에게 주문
cos.order(hoho); // 에러 !! -> 이것을 해결하기 위해 상속 필요 -> 해결
}
왜 ?
main.dart
import 'cos.dart';
import 'ssar.dart';
import 'emp.dart';
main() {
Cos cos = Cos(); //손님
Ssar ssar = Ssar(); //직원 ssar, emp
Hoho hoho = Hoho(); //직원 hoho,emp
Emp ssar = Ssar();
// 손님 cos가 직원 ssar에게 주문
cos.order(ssar);
// 손님 cos가 직원 hoho에게 주문
cos.order(hoho); // 메모리에 hoho, emp 둘다 적재
}
메모리에 hoho, emp 둘다 적재 되었을때
emp.dart
import 'icecream.dart';
//직원
class Emp {
// 무효화됨 (오버라이드, Override)
Icecream makeIcecream(){}
}
hoho.dart
import 'icecream.dart';
import 'emp.dart';
class Hoho extends Emp {
//오버라이드
Icecream makeIcecream(){ // 재정의, 동적바인딩
return Icecream(50, 30, 20);
}
}
자식이 부모의 함수를 가지고 다시 작성할때 가져온 부모의 함수는 무효화 !! == Override
실행시에 동적으로 부모 메서드를 무시하고 무효화시켜버리고 자식의 메서드가 실행되는 것 == 동적바인딩
추상화
상속을 위한 껍데기 클래스인 emp 클래스를 추상화 → abstract
emp.dart
import 'icecream.dart';
//직원
abstract class Emp {
// 무효화됨 (오버라이드, Override)
Icecream makeIcecream(){} // 몸체가 없는 뼈대 추상메서드 만들 수 있음
}
// 이제 extends로 emp를 가져오면 makeIcecream 메서드가 없을때 오류 발생
정리
상속은 같은 타입으로 묶기 위해서 사용
추상화는 상속을 했을때 강제성을 부여하여 상속받은 클래스의 뼈대를 만들기 위해 사용
참고
https://www.youtube.com/watch?v=Pe4oLca1dF4&list=PL93mKxaRDidGEaUXprXqhNvSW02xCjLZI&index=16