인프런 커뮤니티 질문&답변

Seung Min Liang님의 프로필 이미지

작성한 질문수

Flutter 앱 개발 실전

extends & mixin

상속과 mixin 의 존재 이유.

해결된 질문

24.06.16 13:56 작성

·

111

·

수정됨

1

mixin 이 사실상 상속(extend)을 대체할 수 있는것 처럼보이는데,

상속에 대한 존재 의의가 있는 것인지 생각이 듭니다.

상속은 어떨 때 mixin 대신 사용되어야 하는 것일까요?

답변 1

1

DevStory님의 프로필 이미지
DevStory
지식공유자

2024. 06. 16. 14:21

안녕하세요.

Dart에서 mixin과 상속은 각각의 용도와 역할이 다릅니다. 따라서 둘 다 존재하는 이유가 있고, 특정 상황에서는 mixin이 아닌 상속을 사용하는 것이 더 적절할 수 있습니다.

상속은 "is-a" 관계를 나타내며, 한 클래스가 다른 클래스의 특성과 행동을 그대로 이어받아 확장할 때 사용됩니다. 상속은 코드의 재사용성과 계층 구조를 설계할 수 있습니다.

- 클래스 간의 강력한 관계를 정의하고 싶을 때.

- 자식 클래스가 부모 클래스의 모든 메서드와 속성을 가져야 하며, 이를 기반으로 추가적인 기능을 구현할 때.

- 다형성을 통해 부모 클래스를 참조하여 다양한 자식 클래스를 처리할 필요가 있을 때.

class Animal {

  void makeSound() {
    print('Animal makes a sound');
  }
}

class Dog extends Animal {

  @override
  void makeSound() {
    print('Dog barks');
  }
}

 

mixin은 "has-a" 관계를 나타내며, 클래스에 특정 기능을 추가할 때 사용됩니다. mixin은 여러 클래스에 공통적인 기능을 쉽게 공유할 수 있습니다.

- 특정 기능(메서드나 속성)을 여러 클래스에 공통적으로 추가해야 할 때.

- 다중 상속이 불가능한 Dart에서 상속 없이 여러 기능을 한 클래스에 포함시키고 싶을 때.

- 클래스 간의 강력한 계층 구조가 필요하지 않고, 단순히 기능을 공유하고 싶을 때.

mixin Swimmable {

  void swim() {
    print('Swimming');
  }
}

mixin Flyable {

  void fly() {
    print('Flying');
  }
}

class Duck with Swimmable, Flyable {}

void main() {
  Duck duck = Duck();
  duck.swim();
  duck.fly();
}

 

정리하면,

- 상속은 강력한 계층 구조와 "is-a" 관계를 나타낼 때 사용됩니다.

- mixin은 단순히 기능을 추가하고 공유하는 용도로, 여러 클래스에 공통적인 기능을 제공할 때 사용됩니다.

둘은 서로 대체할 수 있는 것이 아니라, 목적과 사용 상황에 따라 적절히 선택해야 하는 도구로 보시면 됩니다 :)