extends, implements, with

하요·2024년 7월 5일
0
post-thumbnail

Dart의 클래스 상속, 인터페이스 구현, 기능 확장: extends, implements, with

Dart에서는 클래스 상속, 인터페이스 구현, 믹스인을 통해 코드의 재사용성과 확장성을 높일 수 있습니다. 이 중에서 extends, implements, with 키워드는 각각의 용도와 특성이 있으며, 클래스 계층 구조를 구축하고 다양한 기능을 결합하는 데 사용됩니다. 추상 클래스도 포함하여 설명하겠습니다.

주요 키워드 소개

  • extends: 단일 상속을 통해 클래스의 기능을 확장합니다. 일반 클래스와 추상 클래스 상속도 포함됩니다.
  • implements: 인터페이스 역할을 하는 클래스의 메서드와 프로퍼티를 구현합니다.
  • with: 다중 상속을 흉내내고, 클래스에 믹스인 기능을 혼합합니다.

차이점

  • extends:
    • 목적: 단일 상속을 통해 클래스 확장 (추상 클래스 포함)
    • 사용 방법: 한 클래스가 다른 클래스를 상속받을 때 사용
    • 특징:
      • 상속받은 클래스의 모든 메서드와 프로퍼티를 물려받음
      • 상속받은 메서드를 재정의할 수 있음
      • 단일 상속만 가능 (하나의 부모 클래스만 가질 수 있음)
    • 예:
      • 일반 클래스: class Dog extends Animal { ... }
      • 추상 클래스: class Dog extends Animal { ... }
  • implements:
    • 목적: 인터페이스 역할을 하는 클래스의 메서드와 프로퍼티를 구현
    • 사용 방법: 클래스가 인터페이스 역할을 하는 클래스를 구현할 때 사용
    • 특징:
      • 모든 메서드와 프로퍼티를 재정의해야 함
      • 다중 구현 가능 (여러 인터페이스를 동시에 구현할 수 있음)
    • 예: class Bird implements Flyer { ... }
  • with:
    • 목적: 다중 상속을 흉내내고, 클래스에 믹스인 기능을 혼합
    • 사용 방법: 클래스가 믹스인을 사용할 때 사용
    • 특징:
      • 이미 구현된 메서드와 프로퍼티를 재사용 가능
      • 다중 믹스인 사용 가능
      • 믹스인의 메서드와 프로퍼티를 재정의할 수 있음
    • 예: class Bird with Flyer, Walker { ... }

extends의 두 가지 사용 예제

일반 클래스 상속

일반 클래스를 상속받을 때, 자식 클래스는 부모 클래스의 모든 메서드와 프로퍼티를 물려받고, 이를 재정의하거나 확장할 수 있습니다.

class Animal {
  void breathe() {
    print('Breathing...');
  }
}

class Dog extends Animal {
  void bark() {
    print('Woof! Woof!');
  }
}

void main() {
  Dog dog = Dog();
  dog.breathe(); // 출력: Breathing...
  dog.bark();    // 출력: Woof! Woof!
}

추상 클래스 상속

추상 클래스를 상속받을 때, 자식 클래스는 추상 클래스의 추상 메서드를 반드시 구현해야 합니다. 이는 부모 클래스에서 정의된 특정 메서드의 구현을 자식 클래스에 강제할 수 있게 합니다.

abstract class Animal {
  void breathe() {
    print('Breathing...');
  }
  void makeSound(); // 추상 메서드
}

class Dog extends Animal {
  
  void makeSound() {
    print('Woof! Woof!');
  }
}

void main() {
  Dog dog = Dog();
  dog.breathe(); // 출력: Breathing...
  dog.makeSound(); // 출력: Woof! Woof!
}

implements 예제

인터페이스 역할을 하는 클래스를 구현할 때, 클래스는 해당 인터페이스의 모든 메서드와 프로퍼티를 재정의해야 합니다.

class Flyer {
  void fly(){
  	print('fly');
  };
  String name;
}

class Bird implements Flyer {
  
  void fly() {
    print('Bird is flying');
  }

  
  String name;
}

void main() {
  Bird bird = Bird();
  bird.name = "Sparrow";
  bird.fly(); // 출력: Bird is flying
  print(bird.name); // 출력: Sparrow
}

with 예제

믹스인을 사용하여 여러 클래스에서 공통 기능을 재사용할 수 있습니다. 믹스인은 이미 구현된 메서드와 상태를 포함할 수 있으며, 다중 믹스인 사용이 가능합니다.

mixin FlyerMixin {
  void fly() {
    print('Flying');
  }
}

mixin WalkerMixin {
  void walk() {
    print('Walking');
  }
}

class MixedBird with FlyerMixin, WalkerMixin {
  void chirp() {
    print('Chirping');
  }
}

void main() {
  MixedBird mixedBird = MixedBird();
  mixedBird.fly(); // 출력: Flying
  mixedBird.walk(); // 출력: Walking
  mixedBird.chirp(); // 출력: Chirping
}

추가 팁

  • 효율적인 상속 구조: 상속을 남용하지 않고 필요한 경우에만 사용하여 클래스를 단순하고 유지보수하기 쉽게 유지합니다.
  • 다형성 활용: implements를 사용하여 인터페이스를 구현하면 다양한 클래스가 동일한 인터페이스를 구현할 수 있어 다형성을 쉽게 활용할 수 있습니다.
  • 코드 재사용성: with를 사용하여 공통 기능을 여러 클래스에서 재사용할 수 있습니다.

관련 자료

  • extends: 클래스 상속에 대한 Dart 공식 문서
  • implements: 인터페이스 구현에 대한 Dart 공식 문서
  • mixin: 믹스인 사용에 대한 Dart 공식 문서
  • abstract: 추상 클래스에 대한 Dart 공식 문서
profile
flutter 개발자(진)

0개의 댓글