Dart에서는 클래스 상속, 인터페이스 구현, 믹스인을 통해 코드의 재사용성과 확장성을 높일 수 있습니다. 이 중에서 extends
, implements
, with
키워드는 각각의 용도와 특성이 있으며, 클래스 계층 구조를 구축하고 다양한 기능을 결합하는 데 사용됩니다. 추상 클래스도 포함하여 설명하겠습니다.
class Dog extends Animal { ... }
class Dog extends Animal { ... }
class Bird implements Flyer { ... }
class Bird with Flyer, Walker { ... }
일반 클래스를 상속받을 때, 자식 클래스는 부모 클래스의 모든 메서드와 프로퍼티를 물려받고, 이를 재정의하거나 확장할 수 있습니다.
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!
}
인터페이스 역할을 하는 클래스를 구현할 때, 클래스는 해당 인터페이스의 모든 메서드와 프로퍼티를 재정의해야 합니다.
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
}
믹스인을 사용하여 여러 클래스에서 공통 기능을 재사용할 수 있습니다. 믹스인은 이미 구현된 메서드와 상태를 포함할 수 있으며, 다중 믹스인 사용이 가능합니다.
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
를 사용하여 공통 기능을 여러 클래스에서 재사용할 수 있습니다.