1. 상속
1-1 기본
Ssar.dart
- 직원으로 손님에게 아이스크림을 만들어 주는 역할입니다.
// 직원
import 'icecream.dart';
class Ssar {
// 책임 = 아이스크림
// 아이스크림 생산
Icecream makeIcecream(){
return Icecream();
}
}
Cos.dart
- 손님으로 직원에게 아이스크림을 주문하는 역할입니다.
// 손님
import 'icecream.dart';
import 'ssar.dart';
class Cos {
var name;
// 책임 = 주문
// 즉 Cos는 주문을 받는 담당
void order(Ssar ssar) {
Icecream icecream = ssar.makeIcecream();
print("아이스크림을 받았습니다.");
}
}
Icecream.dart
main.dart
import 'cos.dart';
import 'ssar.dart';
main(){
// 손님
Cos cos = Cos();
// 직원
Ssar ssar = Ssar();
// 손님이 주문을 하면 직원 아이스크림을 손님에게 줌
cos.order(ssar);
love.order(ssar);
}
1-2 손님과 직원 추가
love.dart 추가
- 새로운 손님으로 직원에게 아이스크림을 주문하는 역할입니다.
// 새로운 손님
import 'icecream.dart';
import 'ssar.dart';
class Love {
var name;
// 책임 = 주문
// 즉 Cos는 주문을 받는 담당
void order(Ssar ssar) {
Icecream icecream = ssar.makeIcecream();
print("아이스크림을 받았습니다.");
}
}
hoho.dart 추가
- 새로운 직원으로 손님에게 아이스크림을 만들어 주는 역할입니다.
// 직원
import 'icecream.dart';
class Hoho {
// 책임 = 아이스크림
// 아이스크림 생산
Icecream makeIcecream(){
return Icecream();
}
}
main.dart
import 'cos.dart';
import 'hoho.dart';
import 'love.dart';
import 'ssar.dart';
main(){
// 손님
Cos cos = Cos();
// 직원
Ssar ssar = Ssar();
// 새로운 손님
Love love = Love();
// 새로운 직원
Hoho hoho = Hoho();
// 손님이 주문을 하면 직원 아이스크림을 손님에게 줌
cos.order(ssar);
love.order(ssar);
love.order(hoho);
}
- 한명의 손님이 두명의 직원에게 동시에 주문을 할 수가 없습니다.
- 동시에 주문을 하기 위해서 함수를 추가해야하지만, 이 대신에 상속을 사용합니다.
1-3 상속 사용
emp.dart 추가
// 직원
import 'icecream.dart';
// dart는 interface가 없으므로 abstracet를 추가
abstract class Emp {
// 무효화됨(오버라이드(Override), 자식이 같은 이름의 함수를 들고 있을 때)
Icecream makeIcecream(); // 몸체가 없는 뼈대 추상메서드를 만들 수 있음
}
ssar.dart 수정
// 직원
import 'emp.dart';
import 'icecream.dart';
// extends 상속
// Ssar이라고 불릴 수 있고, Emp라고도 불릴 수 있습니다.
// 즉 다형성을 가집니다.
class Ssar extends Emp {
// 책임 = 아이스크림
// 아이스크림 생산
// 재정의, 동적바인딩
Icecream makeIcecream(){
return Icecream();
}
}
hoho.dart 수정
// 직원
import 'emp.dart';
import 'icecream.dart';
// extends 상속
// Hoho라고 불릴 수 있고, Emp라고도 불릴 수 있습니다.
// 즉 다형성을 가집니다.
class Hoho extends Emp {
// 책임 = 아이스크림
// 아이스크림 생산
Icecream makeIcecream(){
return Icecream();
}
}
main.dart
import 'cos.dart';
import 'hoho.dart';
import 'love.dart';
import 'ssar.dart';
main(){
// 손님
Cos cos = Cos();
// 새로운 손님
Love love = Love();
// 직원(Emp, Ssar)
Ssar ssar = Ssar();
// 새로운 직원(Emp, Hoho)
Hoho hoho = Hoho();
// 손님이 주문을 하면 직원 아이스크림을 손님에게 줌
cos.order(ssar);
love.order(ssar);
love.order(hoho);
}
상속은 같은 Type으로 묶기 위해서 사용합니다.
2. 객체 생성 메모리
- dart는 Java와 달리 외부에 변수, 함수, 클래스를 생성할 수 있습니다.
Main( )
- main( )이 힙(Heap)이라는 메모리 공간에 떠야 합니다.
- 클래스 내부에 있는 것들은 메모리 공간에 뜨지 않습니다.
- 메서드는 메모리 공간에 뜹니다.
- 변수도 메모리 공간에 뜹니다.
메서드( )
- main( )에 hello( ) 메서드를 작성합니다.
- main( )이 실행되면 hello( ) 스택(Stack) 메모리란 공간이 생성되고 그 안에 sum 변수가 등록됩니다.
- hello( ) 메서드의 실행이 종료가 되면 스택 메모리는 없어집니다.
- 스택은 메모리 관리를 하긴 해야하지만, 메서드 내부에서 계속 메서드를 호출하다보면 스택 종료가 되지 않습니다. -> 스택 오버플로우가 발생함.
- 스택은 메서드 실행시 메모리에 잠깐 떴다가 사라지는 것이므로 신경 쓸 필요가 없음
클래스
- 클래스는 인스턴스(객체)를 만들었을 때 힙 메모리 공간에 뜹니다.
- 이 때 뜨는 것은 인스턴스가 가지는 변수와 메서드가 뜹니다.
Dart는 Java와 다르게 클래스 외부에 있는 것들도 다 메모리에 뜬다.
상속
상속의 조건
1. 다형성이 성립되어야 합니다.
2. 데이터를 물려주는 것이 아니라, 타입을 물려주는 것이 상속이다.
- 소나타와 엔진, 햄버거와 더블햄버거가 있을 때
clss 소나타 extends 엔진은 상속이 아니지만, clss 더블햄버거 extends 햄버거는 상속이 맞음
- 소나타야 너 소나타니? ( O )
- 소나타야 너 엔진이니? ( X )
- 더블햄버거야 너 더블햄버거니? ( O )
- 더블햄버거야 너 햄버거니? ( O )
아이스크림 가게 예시
- 위 알고리즘은 매번 직원이나 손님을 바꿔줘야 함
- 위와 같이 만들면 알고리즘을 수정할 필요가 없음
- Ssar extends 손님, 즉 손님 s = Ssar( ); 손님 s2 = Love( );
- Cos extends 직원, 즉 직원 e = Cos( );
3. 상속은 추상화를 하기 위해서 사용합니다.