Menu
Coddy logo textTech

추상 클래스

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()와 같은)와 생성자를 가질 수 있다는 점에 유의하세요. 하위 클래스는 일반적인 상속과 마찬가지로 이들을 상속받습니다. 주요 차이점은 단순히 추상 클래스 자체의 인스턴스를 생성할 수 없으며, 반드시 구체적인 하위 클래스를 사용해야 한다는 것입니다.

challenge icon

챌린지

쉬움

추상 클래스가 어떻게 더 구체적인 타입들을 위한 청사진 역할을 하는지 보여주는 차량 시스템을 구축해 보겠습니다. 모든 차량이 공통으로 가지는 속성을 정의하는 추상 베이스 클래스를 만들고, 이를 확장하여 구체적인 차량 타입들을 만들 것입니다.

코드는 다음 두 개의 파일로 구성합니다:

  • vehicle.dart: 여기에 차량 계층 구조를 정의합니다:
    • String brandint 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는 4Car 인스턴스를 생성합니다.
    • (Vehicle로부터 상속받은) displayInfo() 메서드를 호출합니다.
    • Doors: [doors]를 출력합니다.
    • honk() 메서드를 호출합니다.
    • 빈 줄을 하나 출력합니다.
    • brand는 'Harley', year는 2021, hasSidecar는 falseMotorcycle 인스턴스를 생성합니다.
    • displayInfo() 메서드를 호출합니다.
    • Has sidecar: [hasSidecar]를 출력합니다.
    • revEngine() 메서드를 호출합니다.

Vehicle은 추상 클래스이므로 직접 인스턴스를 생성할 수 없으며, 반드시 구체적인 서브클래스 중 하나를 사용해야 한다는 점을 기억하세요. CarMotorcycle 모두 추상 부모 클래스로부터 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()을 호출하세요
}
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

객체 지향 프로그래밍의 모든 레슨