Menu
Coddy logo textTech

상속의 기초

Coddy Dart 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨 — 110개 중 36번째.

상속은 클래스가 다른 클래스의 속성과 메서드를 획득할 수 있게 해줍니다. 동일한 코드를 다시 작성하는 대신, 기존 클래스를 기반으로 하는 새로운 클래스를 생성합니다. 원래의 클래스는 부모(또는 슈퍼클래스)라고 불리며, 새로운 클래스는 자식(또는 서브클래스)이라고 불립니다.

Dart에서, extends 키워드를 사용하여 부모 클래스로부터 상속받습니다:

class Animal {
  String name;
  
  Animal(this.name);
  
  void eat() {
    print('$name is eating');
  }
}

class Dog extends Animal {
  Dog(String name) : super(name);
  
  void bark() {
    print('$name says woof!');
  }
}

void main() {
  var dog = Dog('Buddy');
  dog.eat();   // Animal에서 상속됨
  dog.bark();  // Dog에서 정의됨
}

Dog 클래스는 Animal로부터 name 속성과 eat() 메서드에 자동으로 접근할 수 있으며, 자신만의 bark() 메서드도 가집니다. 이것은 "is-a" 관계를 생성합니다 - Dog는 Animal입니다.

자식 클래스는 새로운 속성과 메서드를 추가할 수 있지만, 부모로부터 공개된(public) 모든 것을 상속받습니다. 비공개(private) 멤버(_가 붙은 멤버)는 다른 라이브러리의 하위 클래스에서 직접 접근할 수 없지만, 상속된 객체에는 여전히 존재한다는 점에 유의하세요.

challenge icon

챌린지

쉬움

상속을 통해 자식 클래스가 부모 클래스의 기능을 재사용하고 확장하는 방법을 보여주는 차량 시스템을 만들어 보겠습니다. 일반 차량을 위한 부모 클래스와 특정 유형의 차량을 위한 자식 클래스를 생성하게 됩니다.

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

  • vehicle.dart: 여기에 클래스를 정의합니다:
    • String brand 속성, 브랜드명을 인자로 받는 생성자, 그리고 '$brand engine starting...'을 출력하는 start() 메서드를 가진 Vehicle 클래스(부모)
    • Vehicle을 상속받는 Motorcycle 클래스. 추가적인 int cc 속성(엔진 배기량), 브랜드와 cc를 모두 인자로 받는 생성자(super를 사용하여 브랜드를 부모에게 전달), 그리고 '$brand is doing a wheelie!'를 출력하는 고유한 wheelie() 메서드를 가져야 합니다.
  • main.dart: 차량 파일을 임포트하고 상속이 작동하는 모습을 보여줍니다:
    • 브랜드가 'Toyota'Vehicle을 생성합니다.
    • 해당 객체의 start() 메서드를 호출합니다.
    • 브랜드가 'Harley'이고 cc가 1200Motorcycle을 생성합니다.
    • 오토바이의 start() 메서드(Vehicle에서 상속됨)를 호출합니다.
    • 오토바이의 wheelie() 메서드(Motorcycle에 정의됨)를 호출합니다.
    • 자식 클래스의 고유 속성을 보여주기 위해 'Motorcycle engine: ${motorcycle.cc}cc'를 출력합니다.

Motorcycle 클래스가 Vehicle로부터 brand 속성과 start() 메서드에 자동으로 접근할 수 있게 되는 동시에, 자신만의 고유한 cc 속성과 wheelie() 메서드를 갖게 되는 점에 주목하세요. 이것이 바로 기존 코드를 기반으로 구축하는 상속의 힘입니다.

예상 출력 결과:

Toyota engine starting...
Harley engine starting...
Harley is doing a wheelie!
Motorcycle engine: 1200cc

치트 시트

extends 키워드를 사용하여 부모 클래스로부터 상속받는 자식 클래스를 생성합니다:

class Animal {
  String name;
  
  Animal(this.name);
  
  void eat() {
    print('$name is eating');
  }
}

class Dog extends Animal {
  Dog(String name) : super(name);
  
  void bark() {
    print('$name says woof!');
  }
}

자식 클래스는 부모 클래스의 모든 공개 속성과 메서드를 상속받습니다. 자식 생성자에서 super를 사용하여 부모 생성자에 매개변수를 전달합니다.

자식 클래스는 상속받은 속성과 메서드에 접근하면서 자신만의 속성과 메서드를 추가할 수 있습니다:

var dog = Dog('Buddy');
dog.eat();   // Animal에서 상속됨
dog.bark();  // Dog에서 정의됨

이것은 "is-a" 관계를 생성합니다 - Dog는 Animal입니다.

직접 해보기

import 'vehicle.dart';

void main() {
  // TODO: 브랜드가 'Toyota'인 Vehicle을 생성하세요.
  
  // TODO: vehicle의 start() 메서드를 호출하세요.
  
  // TODO: 브랜드가 'Harley'이고 cc가 1200인 Motorcycle을 생성하세요.
  
  // TODO: motorcycle의 start() 메서드를 호출하세요 (Vehicle에서 상속됨).
  
  // TODO: motorcycle의 wheelie() 메서드를 호출하세요.
  
  // TODO: motorcycle의 cc 속성을 사용하여 'Motorcycle engine: [cc]cc'를 출력하세요.
}
quiz icon실력 점검

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

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