[Flutter / Dart] 객체지향 프로그래밍(인터페이스와 믹스인)
그럼 이전 글에 이어서 인터페이스와 믹스인에 대해서 공부해보겠음!
1. 인터페이스
상속은 공유되는 기능을 이어받는 개념이지만, 인터페이스는 공통으로 필요한 기능을 정의만 해두는 역할을 함!
상속에서 사용한 Idol
클래스를 인터페이스로 사용해보겠음. Dart에는 인터페이스를 지정하는 키워드가 따로 없음!
상속은 단 하나의 클래스만 할 수 있지만 인터페이스는 적용 개수에 제한이 없음! 여러 인터페이스를 적용하고 싶으면 ,
기호를 사용하여 인터페이스를 나열해 입력해주면 됨!
// 부모 클래스
class Idol {
final String name;
final int membersCount;
Idol(this.name, this.membersCount);
void sayName() {
print("저는 ${this.name}입니다.");
}
void sayMembersCount() {
print("${this.name}멤버는 ${this.membersCount}명입니다.");
}
}
// implements 키워드를 사용하면 원하는 클래스를 인터페이스로 사용 가능!
class GirlGroup implements Idol {
final String name;
final int membersCount;
GirlGroup(
this.name,
this.membersCount,
);
void sayName() {
print("저는 여자 아이돌 ${this.membersCount}명입니다.");
}
void sayMembersCount() {
print("${this.name} 멤버는 ${this.membersCount}명 입니다.");
}
}
GirlGroup
클래스는 Idol
클래스가 정의한 모든 기능을 다시 정의했음. 그래서 상속과 인터페이스의 차이점이 뭐지?란 생각이 들었음.
- 상속 받을 때는 부모 클래스의 모든 기능이 상속되므로 재정의할 필요가 없음!
- 인터페이스는 반드시 모든 기능을 다시 정의 해줘야함!
귀찮아 보이지만 애초에 반드시 재정의할 필요가 있는 기능을 정의하는 용도가 인터페이스이기 때문에, 실수로 빼먹는 일을 방지할 수 있음!
// 인터페이스 사용법
void main() {
GirlGroup blackPink = GirlGroup("블랙핑크", 4);
blackPink.sayName();
blackPink.sayMembersCount();
}
/* 출력값
저는 여자 아이돌 4명입니다.
블랙핑크 멤버는 4명 입니다.
*/
2. 믹스인
믹스인은 특정 클래스에 원하는 기능들만 골라서 넣을 수 있는 기능임.
특정 클래스를 지정해서 속성들을 정의할 수 있으며 지정한 클래스는 상속하는 클래스에서도 사용할 수 있음.
인터페이스처럼 한 개의 클래스에 여러 개의 믹스인을 적용할 수도 있음. ,
기호로 열거하면 됨!
마찬가지로 상속 때 사용한 Idol
클래스를 사용해 믹스인하는 방법을 공부해보겠음
class Idol {
final String name;
final int membersCount;
Idol(this.name, this.membersCount);
void sayName() {
print("저는 ${this.name}입니다.");
}
void sayMembersCount() {
print("${this.name}멤버는 ${this.membersCount}명입니다.");
}
}
mixin IdolSingMixin on Idol { // mixin키워드로 정의된 믹스인 정의, on Idol은 이 믹스인을 Idol을 상속한 클래스에만 쓸 수 있다는 뜻 (제한 조건을 건 것!)
void sing() { // sing()은 this.name을 사용 -> 즉, Idol클래스의 속성을 참조함
print("${this.name}이(가) 노래를 부릅니다.");
}
}
// 믹스인을 적용할 때는 with 키워드 사용
class BoyGroup extends Idol with IdolSingMixin { // extends Idol -> 부모 클래스로부터 기본 속성과 메서드 상속, with IdolSingMixin -> sing() 메서드도 추가로 섞어 넣음
BoyGroup( // 즉, BoyGroup은 Idol + IdolSingMixin의 기능을 모두 가짐!
super.name, // sayName, sayMembersCount, sing, sayMale 다 가능!!
super.membersCount,
);
void sayMale() {
print("저는 남자 아이돌입니다.");
}
}
void main() {
BoyGroup bts = BoyGroup("BTS", 7);
bts.sayMale(); // BoyGroup의 고유 기능
bts.sing(); // mixin에서 온 기능!
}
/* 출력값
저는 남자 아이돌입니다.
BTS이(가) 노래를 부릅니다.
*/
IdolSingMixin
이라는 믹스인은BoyGroup
클래스에void sing()
을 섞어 넣은거임- 그 결과
BoyGroup
객체는sing()
메서드를 사용할 수 있게 된것임
요약하자면,
- 믹스인은 클래스를 상속하지 않고도 기능을 재사용/주입하는 방법
with
키워드를 통해 클래스에 기능을 "섞어 넣는" 느낌으로 동작
https://github.com/Leedoseo/Flutter_OOP_basic
GitHub - Leedoseo/Flutter_OOP_basic
Contribute to Leedoseo/Flutter_OOP_basic development by creating an account on GitHub.
github.com
https://www.notion.so/Dart-Flutter-Study-1cf9fd9f157980a5ab7efad394810871?pvs=4
Dart / Flutter Study | Notion
Made with Notion, the all-in-one connected workspace with publishing capabilities.
www.notion.so
출처 : 코드팩토리의 플러터 프로그래밍
'Dart 언어' 카테고리의 다른 글
[Flutter / Dart] 객체지향 프로그래밍(스태틱과 캐스케이드 연산자) (1) | 2025.04.08 |
---|---|
[Flutter / Dart] 객체지향 프로그래밍(추상과 제네릭) (0) | 2025.04.08 |
[Flutter / Dart] 객체지향 프로그래밍(상속과 오버라이드) (0) | 2025.04.07 |
[Flutter / Dart] 객체지향 프로그래밍(클래스) (0) | 2025.04.04 |
[Flutter / Dart] Dart 기초문법(함수와 람다) (2) (0) | 2025.04.03 |