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

2024년 05월 16일
 | 
Info-Geon
Dart_Flutter basic img

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은 클래스에 유연하게 기능을 추가할 수 있다.