메모리, heap, stack

위의 그림처럼

먼저, RAM 메모리에 적재 되어야 CPU에서 연산이 가능합니다.

메모리에는 Heap과 Stack 영역이 존재하는데 Dart에서 Heap은 class를 제외한 상단에서 선언한 모든 메소드 및 변수 그리고 main 클래스가 가장 먼저 적재됩니다. 

그러나 메서드의 중괄호 { } 안의 영역은 stack 영역으로써, 호출될 때 stack 영역이 만들어지며 중괄호 { }안의 메서드 및 변수가 적재되고 중괄호의 종료와 함께 없어집니다.

main 클래스 밖에서 선언된 class는 객체를 Animal a = Animal(); 와 같이 생성할때 heap영역에 class안의 변수와 메서드가 적재됩니다.

위와 같이 메서드가 호출될때 stack 영역 또한 생성됩니다.

상속 특징 1. 다형성

Dog 객체가 extends를 통해 animal을 상속 받음으로써 Animal 타입을 사용할 수 있습니다.

추가 예시로

햄버거 <=> 더블햄버거 extends 햄버거
위와 같이 패티 2장인 더블햄버거를 만들때 패티 1장인 햄버거를 상속받아 만들 경우 부모 자식 모두 햄버거 인것은 변함 없습니다.

 

다양한 이름으로 불릴 수 있어야 합니다.

상속 특징 2. 데이터가 아닌 타입을 물려줍니다.

위의 그림의 알고리즘에서 손님 Love가 추가될 때 원래 손님인 Ssar을 변경해야 하는 알고리즘의 수정이 필요합니다.

상속 특징 3. 추상화를 위해 사용합니다.

손님과 직원의 개념을 추상화 시키면서 ssar, love에게 손님의 추상화 된 개념을 주입하고, cos에게 직원의 추상화 된 개념을 주입함을 통해 알고리즘의 수정을 막고 재사용성을 증대 시킵니다.

 

참고

https://www.youtube.com/watch?v=H41XvJKJ4Tk&list=PL93mKxaRDidGEaUXprXqhNvSW02xCjLZI&index=17 

 

728x90

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

[Dart] const 와 final 이해하기  (0) 2021.06.15
[Dart] Future, Isolate  (0) 2021.06.08
[Dart] 상속  (0) 2021.06.07
[Dart] 접근지정자, 생성자, getter, setter  (0) 2021.06.04
[Dart] 클래스  (0) 2021.06.04

상속

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

손님

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