Dart 상속

Ruinak·2021년 9월 22일
0

Dart

목록 보기
9/11
post-thumbnail

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. 상속은 추상화를 하기 위해서 사용합니다.

profile
Nil Desperandum <절대 절망하지 마라>

0개의 댓글