Menu
Coddy logo textTech

생성자와 상속

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

자식 클래스가 부모 클래스를 확장할 때, 상속된 필드를 올바르게 초기화하려면 부모의 생성자를 호출해야 합니다. Dart는 super를 사용하는 초기화 리스트를 통해 이를 처리하는 유연한 방법을 제공합니다.

부모 클래스에 매개변수가 있는 생성자가 있는 경우, 자식 클래스는 이를 명시적으로 호출해야 합니다:

class Person {
  String name;
  int age;
  
  Person(this.name, this.age);
}

class Student extends Person {
  String school;
  
  Student(String name, int age, this.school) : super(name, age);
}

Dart 2.17에서 도입된 슈퍼 매개변수(super parameters)는 매개변수를 부모 생성자로 직접 전달하는 더 깔끔한 구문입니다:

class Student extends Person {
  String school;
  
  // super.name과 super.age는 Person의 생성자로 직접 전달됩니다
  Student(super.name, super.age, this.school);
}

이름이 있는 생성자(named constructors)를 사용할 때, 어떤 부모 생성자를 호출할지 지정합니다:

class Employee extends Person {
  String department;
  
  Employee(super.name, super.age, this.department);
  
  Employee.intern(String name, this.department) : super(name, 18);
}

핵심 규칙은 간단합니다. 자식이 자신의 속성을 추가하기 전에 부모가 완전히 초기화되어야 합니다. 전통적인 super() 호출을 사용하든 최신 super 매개변수를 사용하든, Dart는 상속 체인이 부모에서 자식으로 적절하게 구성되도록 보장합니다.

challenge icon

챌린지

쉬움

상속과 함께 생성자가 어떻게 작동하는지 보여주는 제품 인벤토리 시스템을 구축해 보겠습니다. 서로 다른 제품 유형이 기본 제품 클래스를 확장하는 계층 구조를 만들고, 각 유형은 부모 생성자를 통해 적절한 초기화가 필요합니다.

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

  • product.dart: 여기에 제품 계층 구조를 정의합니다:
    • String namedouble price 속성, 두 값을 모두 받는 생성자, 그리고 [name]: $[price]를 출력하는 info() 메서드를 가진 Product 클래스
    • Product를 확장하고 String author 속성을 추가한 Book 클래스. super 파라미터를 사용하여 nameprice를 부모 생성자로 전달합니다.
    • Product를 확장하고 int warranty 속성(개월 단위)을 추가한 Electronics 클래스. 초기화 리스트에서 전통적인 super() 호출을 사용하여 부모에게 값을 전달합니다.
  • main.dart: 제품 파일을 임포트하고 두 가지 생성자 상속 방식을 모두 시연합니다:
    • 이름이 'Dart Essentials', 가격이 29.99, 저자가 'Jane Smith'Book을 생성합니다.
    • 해당 객체의 info() 메서드를 호출한 다음, Author: [author]를 출력합니다.
    • 빈 줄을 하나 출력합니다.
    • 이름이 'Wireless Mouse', 가격이 45.50, 보증 기간이 24Electronics를 생성합니다.
    • 해당 객체의 info() 메서드를 호출한 다음, Warranty: [warranty] months를 출력합니다.

두 자식 클래스 모두 오버라이드할 필요 없이 Product로부터 info() 메서드를 상속받습니다. 핵심적인 차이점은 부모 생성자를 호출하는 방식에 있습니다. Book은 더 깔끔한 super 파라미터 문법을 사용하는 반면, Electronics는 초기화 리스트에서 super()를 사용하는 전통적인 방식을 사용합니다.

예상 출력:

Dart Essentials: $29.99
Author: Jane Smith

Wireless Mouse: $45.5
Warranty: 24 months

치트 시트

자식 클래스가 부모 클래스를 확장할 때, 상속된 필드를 올바르게 초기화하려면 부모의 생성자를 호출해야 합니다.

전통적인 방식 - 이니셜라이저 리스트에서 부모 생성자를 명시적으로 호출합니다:

class Person {
  String name;
  int age;
  
  Person(this.name, this.age);
}

class Student extends Person {
  String school;
  
  Student(String name, int age, this.school) : super(name, age);
}

Super 매개변수 (Dart 2.17+) - 매개변수를 부모 생성자로 직접 전달합니다:

class Student extends Person {
  String school;
  
  Student(super.name, super.age, this.school);
}

이름 있는 생성자(Named constructors) - 호출할 부모 생성자를 지정합니다:

class Employee extends Person {
  String department;
  
  Employee(super.name, super.age, this.department);
  
  Employee.intern(String name, this.department) : super(name, 18);
}

직접 해보기

import 'product.dart';

void main() {
  // TODO: 다음을 포함하는 Book 생성:
  // - name: 'Dart Essentials'
  // - price: 29.99
  // - author: 'Jane Smith'

  // TODO: book의 info() 메서드 호출

  // TODO: "Author: [author]" 출력

  // TODO: 빈 줄 출력

  // TODO: 다음을 포함하는 Electronics 생성:
  // - name: 'Wireless Mouse'
  // - price: 45.50
  // - warranty: 24

  // TODO: electronics의 info() 메서드 호출

  // TODO: "Warranty: [warranty] months" 출력
}
quiz icon실력 점검

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

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