본문 바로가기
2023년 부터/Flutter

Dart - 믹스인(mixin)

by JeongUPark 2023. 10. 19.
반응형
  • mixin이라는 예약어로 선언되는 변수 또는 함수 입니다. 클래스는 아니기 때문에 생성자는 선언할 수 없습니다.믹스인은 생성자를 가질 수 없으므로 객체를 생성할 수도 없다.
mixin MyMixin{
	int data1 = 10;
  static int data2 = 20;

  MyMixin(){} // 오류
	
	void test(){
	}
	static void test2(){}
}

main(){
	var obj = MyMixin(); // 오류
}
  • 객체지향 언어는 다중상속을 지원하지 않는다. 그런데 여러 클래스에 선언된 멤버를 상속한 것 처럼 이용하고 싶을 때가 있다. 이때 믹스인을 사용한다.
mixin MyMixin{
	int data1 = 10;
  static int data2 = 20;

  MyMixin(){} // 오류
	
	void test(){
	}
	static void test2(){}
}

main(){
	var obj = MyMixin(); // 오류
}

class MyClass with MyMixin{
	void sayHello(){
		print('data : $data1');
		test1();
	}
}
  • with 예약어로 믹스인을 이용하는 클래스의 객체는 믹스인 타입으로 사용할 수 있다.
class MyClass with Mixin{}

main(){
	var obj = MyClasS();
  if(obj is Mixin){
		print('obj is Mixin');	
	}else {
		print('obj is not Mixin');
	}
	MyMixin obj2 = MyClass();

}
  • 믹스인은 모든 클래스에서 with예약어로 사용할 수 있다. 그런데 특정 타입의 클래스에서만 사용하도록 제한할 수도 있다. 이떄는 믹스인 선언 부에 on 예약어로 해당 타입을 지정해준다.
mixin MyMixin on MySuper{}

class MySuper{}

class MyClass extends MySuper with Mixin{}
class MySomeClass with MyMixin{ } // 오류

  • with 예약어를 통하여 믹스인을 사용할 수 있다. 하지만 클래스도 with를 사용할 수 있다.
class SomeClass{
	int somedata = 10;
}

class MyClass with SomeClass{
	void sayHello(){
		print("$somedata");
	}
}
  • 그런데 만약 class에 생성자가 선언되어 있다면 with를 사용할 수 없다. 이유는 with는 mixin을 위한 예약어이고 mixin은 객체가 아니기 때문에 생성자를 가질 수 없다.
class User{
	User(){}
}

class MyClass with User{ // 오류
}
반응형