Flutter 다중 상속과 대안

김성연·2024년 7월 29일
0

Flutter

목록 보기
52/53

다중 상속이란?

  • 하나의 클래스가 둘 이상의 부모 클래스로부터 상속 받는 행위
  • 지원하는 언어: C++, Python
  • 지원하지 않는 언어: Dart, C#, Python

다중 상속의 문제점

  • 다이아몬드 문제

  • Father, Mother 클래스는 Person 클래스를 상속 받고 Child 클래스는 Father, Mother 클래스를 상속 받는 상황

  • 이때, Child는 Person의 속성과 메서드를 어떠한 경로를 통해 상속 받아야 하는지 명확하지 않는다는 점이 다중 상속의 문제점이다.

  • 왜 명확하지 않으면 안 될까요?
    Person 클래스의 메서드를 Father, Mother 클래스에서 재정의를 했다고 가정한다. Child에서 메서드를 사용한다면 Father과 Mother중에서 어떤 클래스에 있는 메서드를 사용해야 하는지 모른다.

하나의 클래스에서 여러 클래스의 기능을 사용?

  • Mixin은 여러 클래스 간에 코드를 재사용 가능하게 해준다. 상속을 하지 않고, 특정 클래스의 기능을 다른 클래스에 추가할 수 있게 한다.
  • 클래스처럼 직접 인스턴스화 할 수 없으며, 상속을 지원하지 않는다.
  • 정의된 메서드 중 필요한 메서드만 오버라이드해서 사용 가능하다.
mixin Speaker {
  void speak() {
    print('Person is speaking');
  }
}

class Father with Speaker {
  @override
  void speak() {
    print('Father is speaking');
  }
}

class Mother with Speaker {
  @override
  void speak() {
    print('Mother is speaking');
  }
}

class Child extends Father with Mother {
  // Child 클래스는 Father와 Mother의 기능을 모두 가져올 수 있습니다.
  // Mother의 기능이 더 우선순위를 가집니다.
}

void main() {
  Child child = Child();
  child.speak(); // Mother is speaking
}
  • Mixin을 사용하는 클래스는 with 키워드를 사용하여 Mixin 적용

특정 클래스에서만 사용하고 싶다면?

  • on 키워드 사용
class Person {
  void speak() {
    print('Person is speaking');
  }
}

mixin Speaker on Person {
  @override
  void speak() {
    super.speak(); // Person 클래스의 speak 메서드를 호출합니다.
    print('and the speaker is speaking too');
  }
}

class Father extends Person with Speaker {
  @override
  void speak() {
    super.speak(); // 믹스인의 speak 메서드를 호출합니다.
  }
}

void main() {
  Father father = Father();
  father.speak(); // 출력: Person is speaking
                  //      and the speaker is speaking too
}

Mixin + Class

  • Mixin Class는 동일하게 mixin 키워드로 정의
  • 다른 클래스에서 Mixin으로 사용하도록 설계된 클래스(일반 클래스, Mixin 모두 사용 가능)

Mixin은 공동 기능 재사용 하는 상황에 많이 쓰인다.
ex) 로깅(기록), 애니메이션 기능


Dart에서 한 클래스가 여러 역할을 수행해야 한다?

  • Extension
  • Extension이란?
    - 기존 클래스에 새로운 기능을 추가할 수 있게 해준다
    - 원래 클래스의 소스를 수정하지 않고 메서드 추가 가능

Generic Extension

  • 제네릭 타입을 사용하여 확장 메서드를 정의할 수 있게 해준다
  • 제네릭 확장을 사용하면 특정 타입에 관계없이 다양한 타입에 대해 동일한 확장 메서드 적용 가능
//<ExtensionName>: 확장의 이름
//<T>: 제네릭 타입 파라미터
//<Type>: 확장이 적용될 타입
extension <ExtensionName><T> on <Type> { 
	//확장 메서드들
}

Generic 타입이란?

  • 클래스, 메서드, 또는 함수를 정의할 때, 데이터 타입을 파라미터화하여 타입 안전성과 코드 재사용성을 높이는 기능
  • 재네릭을 사용하면 다양한 데이터 타입을 수용하면서도 타입 안전성 유지 가능
class ClassName<T>{
	//클래스 구현
}
  • 여기서 T는 타입 파라미터를 나타내며, 원하는 이름을 사용할 수 있다.
  • 여러 개의 타입 파라미터를 사용 가능

Extension 정리

  • Dart에서 기존 클래스에 새로운 기능을 추가하는 방법

Mixin & Extension 정리

MixinExtension
사용 목적여러 클래스에 공통 기능 주입기존 클래스에 메서드 추가
포함 가능 요소메서드, 속성메서드
속성 추가가능불가능

0개의 댓글