본문 바로가기
new

Dart Mixin: 코드 재사용을 위한 강력한 도구

by ftbd 2024. 3. 7.

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 클래스는 함수 오버라이딩을 통해 기본 클래스의 기능을 확장하고 추가적인 기능을 제공할 수 있습니다.