본문 바로가기
Flutter

[Flutter 14] Dart의 상속과 다형성

by JINJINC 2025. 1. 6.
728x90
반응형
 

 

다트(Dart)의 상속과 다형성 정리


Dart는 객체지향 언어로, **상속(Inheritance)**과 **다형성(Polymorphism)**을 활용해 객체 간의 관계를 설계할 수 있습니다. 하지만 잘못된 설계는 유지보수성과 확장성을 저하시킬 수 있으므로, 상속과 다형성의 개념과 올바른 사용 방법을 이해하는 것이 중요합니다. 아래에서 이를 자세히 정리하겠습니다.


1. 상속(Inheritance)

  • 상속은 부모 클래스가 가진 상태(변수)와 행위(메서드)를 자식 클래스가 물려받는 관계를 의미합니다.
  • Dart에서 상속은 extends 키워드를 사용해 구현합니다.
  • 부모 클래스가 먼저 생성되고, 그 뒤에 자식 클래스가 생성됩니다.
class Burger {
  String? b_name;

  Burger() {
    print('나는 버거');
  }
}

class CheeseBurger extends Burger {
  String? ch_name;

  CheeseBurger() {
    print('치즈버거');
  }
}

void main() {
  CheeseBurger cb = CheeseBurger();
  cb.b_name = '치즈버거'; // 부모 클래스의 변수 사용
  cb.ch_name = '맥도날드 치즈버거'; // 자식 클래스의 변수 사용
}

2. 다형성(Polymorphism)

  • 다형성은 **"여러 가지 형태로 객체를 바라볼 수 있다"**는 객체지향 프로그래밍의 핵심 개념입니다.
  • 상속 관계에서 부모 클래스의 참조 변수를 통해 자식 클래스 객체를 가리킬 수 있습니다.
  • **업캐스팅(Upcasting)**과 **다운캐스팅(Downcasting)**으로 다형성을 활용할 수 있습니다.

업캐스팅(Upcasting)

  • 자식 객체를 부모 클래스 타입으로 참조.
  • 부모 클래스의 멤버만 접근 가능.
Burger b2 = CheeseBurger();
b2.b_name = '치즈'; // 부모 클래스의 변수 사용 가능
// b2.ch_name; // 오류: 부모 타입으로는 자식 클래스 멤버에 접근 불가

다운캐스팅(Downcasting)

  • 부모 클래스 객체를 자식 클래스 타입으로 강제 형변환.
  • 자식 클래스의 멤버에 접근 가능.
Burger b3 = CheeseBurger();
CheeseBurger b4 = b3 as CheeseBurger; // 강제 형변환
b4.ch_name = '즈치'; // 자식 클래스의 변수 사용 가능

print('ch_name 호출: ${(b3 as CheeseBurger).ch_name}');

 

 

3. 상속과 생성자 호출

  • 자식 클래스 객체를 생성할 때 부모 클래스의 생성자가 먼저 호출됩니다.
  • 부모 클래스의 생성자가 매개변수를 가진 경우, 자식 클래스 생성자에서 값을 전달해야 합니다.
  • Dart에서는 이를 **초기화 목록(Initializer List)**과 super 키워드를 사용해 구현합니다.

초기화 목록(Initializer List)

  • 부모 클래스의 생성자에 매개변수가 있다면, 자식 클래스 생성자에서 초기화 목록을 사용해 값을 전달합니다.
class Burger {
  String? name;

  Burger(String? name) {
    print('버거 생성자 호출()');
    this.name = name;
  }
}

class CheeseBurger extends Burger {
  // 초기화 목록과 super 키워드 사용
  CheeseBurger(String? name) : super(name) {
    print('치즈버거 생성자 호출()');
    print('치즈버거 이름: $name');
  }
}

void main() {
  CheeseBurger ch = CheeseBurger('불고기치즈버거');
  print('치즈버거 이름: ${ch.name}');
}

super 키워드

  • 부모 클래스의 생성자 호출 또는 부모 클래스의 변수/메서드 참조에 사용됩니다.
class CheeseBurger extends Burger {
  CheeseBurger(super.name) {
    print('치즈버거 생성자 호출()');
  }
}

 

4. 상속 설계의 주의점

4.1. 다형성이 성립해야 함

  • 상속은 "is-a" 관계를 만족해야 합니다.
  • 예를 들어, BMW 클래스와 Genesis 클래스가 Engine 클래스를 상속하는 것은 적절하지 않습니다.
  • BMW와 Genesis는 Engine이 아니기 때문입니다.
  • 이런 경우에는 합성(Composition) 관계를 사용하는 것이 적합합니다.

4.2. 상속은 "부모의 모든 특성을 자식이 가져야 하는 경우"에만 사용

  • 부모 클래스의 변경이 자식 클래스에 영향을 미치므로, 상속 남용은 유지보수성을 떨어뜨릴 수 있습니다.

5. 요약

  1. 상속
    • 부모 클래스의 상태와 메서드를 자식 클래스가 물려받음.
    • Dart에서는 extends 키워드를 사용.
  2. 다형성
    • 객체를 여러 형태로 바라볼 수 있는 객체지향 프로그래밍의 중요한 개념.
    • 업캐스팅과 다운캐스팅으로 구현 가능.
  3. 생성자 호출
    • 부모 클래스의 생성자가 먼저 호출됨.
    • 초기화 목록(Initializer List)와 super 키워드로 부모 생성자를 호출.
  4. 설계 주의사항
    • "is-a" 관계가 성립해야 상속이 적절.
    • 잘못된 상속은 유지보수성을 저하시킬 수 있음.

이 글이 여러분의 Dart 상속 설계와 다형성 이해에 도움이 되길 바랍니다! 😊

728x90
반응형

'Flutter' 카테고리의 다른 글

[Flutter 15] storeApp 만들기1  (0) 2025.01.06
[Flutter 13] Null 억제 연산자(!) 와 late  (0) 2025.01.06
[Flutter 12] Dart Null Safety  (0) 2025.01.06

댓글