상속은 객체 지향 프로그래밍의 핵심 원칙 중 하나로, 코드 재사용성을 높이고, 관리를 용이하게 하며, 다형성을 가능하게 합니다. Dart에서 상속은 클래스가 다른 클래스의 속성과 메소드를 상속받을 수 있도록 해주어, 코드의 중복을 줄이고 유지보수를 간편하게 합니다.
Dart에서 모든 클래스는 Object 클래스로부터 기본적으로 상속받습니다. 사용자 정의 클래스에서 다른 클래스를 상속받고 싶다면, extends 키워드를 사용합니다. 상속받은 클래스를 서브클래스(자식 클래스)라 하고, 상속을 제공하는 클래스를 슈퍼클래스(부모 클래스)라고 합니다.
예시: 상속 사용하기
// 슈퍼클래스
class Vehicle {
String make;
String model;
Vehicle(this.make, this.model);
void start() {
print('$make $model starts');
}
}
// 서브클래스
class Car extends Vehicle {
double engineSize;
//서브클래스의 생성자에서 슈퍼클래스의 생성자 호출
Car(String make, String model, this.engineSize) : super(make, model);
void start() {
super.start(); // 슈퍼클래스의 start 메소드 호출
print('Engine size: $engineSize liters - Ready to go!');
}
}
void main() {
var myCar = Car('Toyota', 'Corolla', 1.8);
myCar.start();
}
이때 서브클래스의 생성자는 슈퍼클래스의 생성자를 호출하는 것을 확인할 수 있습니다. 위 방식처럼 서브클래스는 슈퍼클래스의 생성자를 적절히 호출해야 합니다. 이는 객체의 올바른 초기화를 위해 필수적이며, super 키워드를 통해 쉽게 수행할 수 있습니다. 이러한 메커니즘을 통해 Dart는 상속 구조에서도 강력하고 유연한 초기화 방식을 제공합니다.
상속에서 중요한 개념 중 하나는 메소드 오버라이딩입니다. 서브클래스에서 슈퍼클래스의 메소드를 재정의할 수 있으며, 이는 @override 어노테이션을 사용하여 표시합니다. 예제에서 Car 클래스는 Vehicle 클래스의 start 메소드를 오버라이딩하여, 차량의 엔진 크기도 출력합니다.