[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 |