코딩 이야기

[Dart/Flutter] 초보자를 위한 Extends / Mixin / Implements 정리

Flutter를 공부하다보면 Extends / Mixin / Implements 등이 자주 보입니다.

어떤거는 단일 상속 받고 어떤거는 다중 상속이 가능하고 막 복잡한데, 저도 초보자이기 때문에 저를 위한 정리를 여러분들과 공유할까 싶습니다!

  • Extends

상속을 사용하여, 한 클래스가 다른 클래스의 모든 속성과 메서드를 받아 자신의 것으로 만듬. 상속을 통해 코드 재사용성과 계층 구조를 만들 수 있다.
단일 상속만 지원함

=> 상속받는 클래스(Dog)가 상속해주는 클래스(Animal) 모든 속성과 메서드를 자신의 것처럼 사용할 수 있다는 것입니다.
다른 클래스의 모든 속성과 메서드를 상속만 받으면 사용할 수 있기 때문에, 같은 메서드를 다시 구현할 필요가 없이 사용이 가능하기에 코드의 재사용성이 높습니다.

class Animal {
 void eat() => print('동물은 먹을수가 있어요.');
}

class Dog extends Animal{
 void bark() => print('개는 짖을수가 있어요.');
}

// 여기서 Dog class는 Animal class를 상속 받는다.
// 이로인해 Dog class는 Animal class의 속성 및 메서드를 사용 가능함.
// Dog 인스턴스는 bark()와 eat() 둘 다 사용 가능함.
  • Mixin

클래스에 코드를 혼합할 수 있게 해주며, 다중 상속과 유사한 방식으로 여러 클래스의 기능을 하나의 클래스에 추가할 수 있게함.

class Animal {
 void eat() => print('동물은 먹을 수가 있어요.');
}

mixin Flyer {
 void fly() => print('이 동물은 날 수 있어요.');
}

mixin Swimmer {
 void swim() => print('이 동물은 수영할 수 있어요.');
}

class Dcuk extends Animal with Flyer, Swimmer {
};

//여기서 Duck class는 eat, fly, swim의 3가지 메서드를 모두 사용할 수 있음.
  • implements

클래스가 특정 인터페이스를 구현하도록 강제함. (클래스 구현의 청사진 제공과 비슷함.)

예를들어 FlyingFish는 이름값을 하도록 날거나 수영할 수 있도록 해야겠죠? 그러니 아래와 같이 선언하는 것입니다.

abstract class Flyer{
 void fly();
}

abstract class Swimmer{
 void swim();
}

class FlyingFish implements Flyer, Swimmer{
 @override
 void fly() => print('플라잉 피쉬는 날아요!');
 
 @override
 void swim() => print('플라잉 피쉬는 수영도 해요!');
} 

 

간단한 문제입니다.

아래의 human class는 어떤 함수를 쓸 수 있고, 어떤 함수를 구현해야 할까요?

class Animal {
 void eat() => print('This animal eats.');
}

mixin Swimmer {
 void swim() => print('This animal can swim.');
}

abstract class Flyer{
 void fly();
}

class human extends Animal with Swimmer implements Flyer{
 void drinking() => print('human can drink.');
 void fly() => print('human can't fly without airplane.');
}
  • human은 Animal을 상속받고(extends), Swimmer 기능을 혼합했으며(mixin), Flyer라는 abstract class를 implements 함.

    그래서 eat, swim, drinking, fly 함수를 사용할 수 있고, fly 함수는 필수적으로 구현해야합니다.

Extends와 Mixin의 차이:

  • extends는 상속을 나타내며, 단일 상속만 지원함. 또한 is-a 관계 (human은 animal 이다)
  • Mixin은 혼합을 위해 사용되며, 특정 기능이나 동작을 클래스에 추가하기 위해 사용됨. can-do 관계 또는 has-a 관계를 나타냄.(human은 swim할 수 있다.)
  • 즉, extends는 강력한 계층적 관계를 구축하고, mixin은 클래스에 유연하게 기능을 추가할 수 있다.
Info-Geon

Recent Posts

[Dart/Flutter] HttpException: Connection closed while receiving data 문제 해결

서버를 구성하여 앱으로 데이터를 받으려던 순간, HttpException: Connection closed while receiving data 에러가 발생하였습니다. 여러가지…

1개월 ago

[Flask/WSL] WSL2 서버 외부 접속 시, 접속 안되는 문제 해결

WSL2로 서버를 실행 시켰을 때, 접속이 안될때가 있습니다. 분명 외부IP를 적어서 접속을 했는데도 안된다면, 들어와서…

2개월 ago

[Dart/Flutter] Future, Stream의 차이와 async, then의 차이

Dart를 이용하여 코딩을 하다 보면, Future, Stream 등을 사용할 때가 있습니다. 또한 받을 때는 async를…

2개월 ago

커피는 어떻게 우리의 잠을 깨울까? 커피의 효과와 부작용

커피는 어떻게 우리의 잠을 깨우고 각성시킬까요? 또한 이로 인한 부작용은 무엇일까요? 알고 마시면 더 좋은…

3개월 ago

WWDC 24 핵심 요약: 애플 AI 핵심 업데이트 및 Siri의 혁신

애플의 연례 개발자 회의인 WWDC 2023에서 애플은 많은 사람들의 기대를 모았던 AI 기술, 특히 Siri의…

3개월 ago

[Dart/Flutter] bool operator == (Object other)이 뭘까요? (객체 동등성 비교)

bool operator == (Object other) 과 같은 코드가 한번씩 보입니다. 과연 이는 무엇을 뜻하는 코드일까요?…

3개월 ago