Dart Mixin은 코드 중복을 줄이고 클래스 간에 기능을 쉽게 공유할 수 있도록 하는 강력한 기능입니다. Mixin은 클래스처럼 보이지만 직접 인스턴스화할 수는 없으며, 다른 클래스에 "믹스인"되어 기능을 추가하는 데 사용됩니다.
Mixin 작동 방식
Mixin은 다음과 같은 방식으로 작동합니다.
- 멤버: Mixin은 메서드, 변수, getter/setter 등을 포함할 수 있습니다.
- 상속: Mixin은 다른 Mixin을 상속받을 수 있습니다.
- Mixin 참조: 클래스는 with 키워드를 사용하여 Mixin을 참조합니다.
Mixin을 사용하면 코드를 여러 번 작성할 필요 없이 기능을 여러 클래스에 공유할 수 있습니다. 또한 Mixin을 사용하면 코드를 더 작고 관리하기 쉬운 단위로 나눌 수 있으며, 기존 클래스에 새로운 기능을 쉽게 추가할 수 있습니다.
Mixin 사용 예시
1. 변수
다음은 Logger Mixin에서 logLevel 변수를 선언하고 사용하는 예시입니다.
mixin Logger {
int logLevel = 1; // 기본 로그 레벨 설정
void log(String message) {
if (logLevel >= 1) {
print('[${DateTime.now()}] $message');
}
}
void setLogLevel(int level) {
logLevel = level;
}
}
class MyClass with Logger {
void doSomething() {
logLevel = 2; // 로그 레벨을 2로 설정
log('Something was done!');
}
}
void main() {
var myClass = MyClass();
myClass.doSomething();
}
위 코드에서 MyClass 클래스는 Logger Mixin을 참조하고 logLevel 변수를 2로 설정하여 "Something was done!" 메시지만 출력합니다.
2. 함수
다음은 Logger Mixin에서 log() 함수를 오버라이딩하는 예시입니다.
mixin Logger {
void log(String message) {
print('[${DateTime.now()}] $message');
}
}
class MyClass with Logger {
@override
void log(String message) {
super.log('[MyClass] $message');
}
}
void main() {
var myClass = MyClass();
myClass.log('Something was done!');
}
위 코드에서 MyClass 클래스는 Logger Mixin의 log() 함수를 오버라이딩하여 메시지 앞에 "[MyClass]"라는 접두사를 추가합니다.
Mixin의 장점
- 코드 중복 감소: Mixin을 사용하면 코드를 여러 번 작성할 필요 없이 기능을 여러 클래스에 공유할 수 있습니다.
- 코드 유지 관리 향상: Mixin을 사용하면 코드를 더 작고 관리하기 쉬운 단위로 나눌 수 있습니다.
- 확장성 향상: Mixin을 사용하면 기존 클래스에 새로운 기능을 쉽게 추가할 수 있습니다.
Mixin 사용 시 주의 사항
- 다중 상속 문제: Mixin은 다중 상속을 지원하지 않습니다. Mixin을 여러 개 사용하면 충돌이 발생할 수 있습니다.
- 명명 충돌: Mixin과 클래스의 멤버 이름이 충돌하면 오류가 발생할 수 있습니다.
- 의존성 관리: Mixin은 다른 Mixin 또는 클래스에 의존할 수 있습니다. Mixin을 사용할 때 의존성 관계를 명확하게 이해해야 합니다.
Mixin 클래스 함수 오버라이딩 방법
Mixin 클래스에서 함수를 오버라이딩하려면 다음과 같이 합니다.
- @override 어노테이션: Mixin 클래스에서 함수를 오버라이딩하려면 @override 어노테이션을 사용해야 합니다. 이 어노테이션은 컴파일러에게 오버라이딩하려는 함수가 실제로 존재하는지 확인하도록 지시합니다.
- super 키워드: Mixin 클래스에서 오버라이딩된 함수는 super 키워드를 사용하여 기본 클래스의 함수 구현을 호출할 수 있습니다.
Mixin 클래스 함수 오버라이딩 예시
다음은 Logger Mixin에서 log() 함수를 오버라이딩하는 예시입니다.
mixin Logger {
void log(String message) {
print('[${DateTime.now()}] $message');
}
}
class MyClass with Logger {
@override
void log(String message) {
super.log('[MyClass] $message'); // 기본 클래스 함수 호출
// 추가적인 처리
}
}
void main() {
var myClass = MyClass();
myClass.log('Something was done!');
}
위 코드에서 MyClass 클래스는 Logger Mixin의 log() 함수를 오버라이딩하여 메시지 앞에 "[MyClass]"라는 접두사를 추가합니다. 또한 super 키워드를 사용하여 기본 클래스의 log() 함수 구현을 호출합니다.
Mixin 클래스 함수 오버라이딩 시 주의 사항:
- 오버라이딩 가능한 함수: Mixin 클래스에서 오버라이딩하려는 함수는 반드시 @override 어노테이션을 사용해야 합니다.
- 반환 값: 오버라이딩된 함수는 기본 클래스 함수와 동일한 반환 값을 가져야 합니다.
- 파라미터: 오버라이딩된 함수는 기본 클래스 함수와 동일한 파라미터를 가져야 합니다.
Mixin 클래스는 함수 오버라이딩을 통해 기본 클래스의 기능을 확장하고 추가적인 기능을 제공할 수 있습니다.
'new' 카테고리의 다른 글
Flutter의 GlobalKey란? (0) | 2024.03.11 |
---|---|
Flutter 앱 라이프 사이클 관리: WidgetsBinding, WidgetsBindingObserver, didChangeAppLifecycleState() (0) | 2024.03.07 |
Flutter App Lifecycle 이해하기: AppLifecycleState enum (0) | 2024.03.07 |
Hot Reload와 Hot Restart (0) | 2024.03.07 |
Flutter 프로젝트에 패키지 추가하기 (0) | 2024.03.07 |