추상 클래스
Coddy Dart 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨 — 110개 중 43번째.
추상 클래스(abstract class)는 직접 인스턴스화할 수 없는 클래스입니다. 이는 다른 클래스를 위한 청사진 역할을 하며, 서브클래스가 따라야 하는 공통 구조를 정의합니다. abstract 키워드를 사용하여 생성합니다.
abstract class Shape {
String color;
Shape(this.color);
void describe() {
print('A $color shape');
}
}
class Circle extends Shape {
double radius;
Circle(String color, this.radius) : super(color);
}
void main() {
// Shape s = Shape('red'); // 오류! 추상 클래스는 인스턴스화할 수 없습니다
var circle = Circle('blue', 5.0);
circle.describe(); // 파란색 도형
}추상 클래스는 그 자체로 존재하기에는 너무 일반적인 개념이 있을 때 유용합니다. "Shape"는 하나의 개념이지만, 그것이 원인지, 사각형인지, 아니면 삼각형인지 알지 못하면 도형을 그릴 수 없습니다. 추상 클래스는 모든 도형이 공통으로 가지는 요소를 정의하며, 구체적인 서브클래스(subclasses)가 세부적인 내용을 제공합니다.
추상 클래스는 여전히 구현부가 있는 일반 메서드(describe()와 같은)와 생성자를 가질 수 있다는 점에 유의하세요. 하위 클래스는 일반적인 상속과 마찬가지로 이들을 상속받습니다. 주요 차이점은 단순히 추상 클래스 자체의 인스턴스를 생성할 수 없으며, 반드시 구체적인 하위 클래스를 사용해야 한다는 것입니다.
챌린지
쉬움추상 클래스가 어떻게 더 구체적인 타입들을 위한 청사진 역할을 하는지 보여주는 차량 시스템을 구축해 보겠습니다. 모든 차량이 공통으로 가지는 속성을 정의하는 추상 베이스 클래스를 만들고, 이를 확장하여 구체적인 차량 타입들을 만들 것입니다.
코드는 다음 두 개의 파일로 구성합니다:
vehicle.dart: 여기에 차량 계층 구조를 정의합니다:String brand와int year속성을 가진abstract class Vehicle을 만듭니다. 두 값을 모두 받는 생성자와[brand] ([year])를 출력하는displayInfo()메서드를 포함하세요.Vehicle을 확장하고int doors속성을 추가한Car클래스를 만듭니다.Beep beep!을 출력하는honk()메서드를 포함하세요.Vehicle을 확장하고bool hasSidecar속성을 추가한Motorcycle클래스를 만듭니다.Vroom!을 출력하는revEngine()메서드를 포함하세요.
main.dart: 차량 파일을 임포트하고 추상 클래스가 어떻게 작동하는지 보여줍니다:- brand는
'Toyota', year는2022, doors는4인Car인스턴스를 생성합니다. - (Vehicle로부터 상속받은)
displayInfo()메서드를 호출합니다. Doors: [doors]를 출력합니다.honk()메서드를 호출합니다.- 빈 줄을 하나 출력합니다.
- brand는
'Harley', year는2021, hasSidecar는false인Motorcycle인스턴스를 생성합니다. displayInfo()메서드를 호출합니다.Has sidecar: [hasSidecar]를 출력합니다.revEngine()메서드를 호출합니다.
- brand는
Vehicle은 추상 클래스이므로 직접 인스턴스를 생성할 수 없으며, 반드시 구체적인 서브클래스 중 하나를 사용해야 한다는 점을 기억하세요. Car와 Motorcycle 모두 추상 부모 클래스로부터 displayInfo() 메서드를 상속받습니다.
예상 출력 결과:
Toyota (2022)
Doors: 4
Beep beep!
Harley (2021)
Has sidecar: false
Vroom!치트 시트
추상 클래스(abstract class)는 직접 인스턴스화할 수 없는 클래스입니다. 이는 다른 클래스를 위한 청사진 역할을 하며, 서브클래스가 따라야 하는 공통 구조를 정의합니다. abstract 키워드를 사용하여 생성합니다:
abstract class Shape {
String color;
Shape(this.color);
void describe() {
print('A $color shape');
}
}
class Circle extends Shape {
double radius;
Circle(String color, this.radius) : super(color);
}
void main() {
// Shape s = Shape('red'); // 오류! 추상 클래스는 인스턴스화할 수 없습니다.
var circle = Circle('blue', 5.0);
circle.describe(); // A blue shape
}추상 클래스는 다음과 같은 요소를 가질 수 있습니다:
- 구현부가 있는 일반 메서드
- 생성자
- 속성
서브클래스는 일반적인 상속과 마찬가지로 이러한 멤버들을 상속받습니다. 주요 차이점은 추상 클래스 자체의 인스턴스는 생성할 수 없으며, 반드시 구체적인 서브클래스를 사용해야 한다는 점입니다.
직접 해보기
import 'vehicle.dart';
void main() {
// TODO: 브랜드 'Toyota', 연식 2022, 문 개수 4개인 Car 객체를 생성하세요
// TODO: car 객체의 displayInfo()를 호출하세요
// TODO: "Doors: [doors]"를 출력하세요
// TODO: car 객체의 honk()를 호출하세요
// TODO: 빈 줄을 출력하세요
// TODO: 브랜드 'Harley', 연식 2021, 사이드카 유무(hasSidecar)가 false인 Motorcycle 객체를 생성하세요
// TODO: motorcycle 객체의 displayInfo()를 호출하세요
// TODO: "Has sidecar: [hasSidecar]"를 출력하세요
// TODO: motorcycle 객체의 revEngine()을 호출하세요
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.