상속

아이스크림 가게에서 주문 중..

손님

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

 

728x90

'Study > Dart' 카테고리의 다른 글

[Dart] Future, Isolate  (0) 2021.06.08
[Dart] 상속을 쓰는 이유  (0) 2021.06.07
[Dart] 접근지정자, 생성자, getter, setter  (0) 2021.06.04
[Dart] 클래스  (0) 2021.06.04
[Dart] final 과 const 차이  (0) 2021.06.04

+ Recent posts