Flutter

Flutter Day 3-2: Dart 상속과 super 키워드

@leem 2025. 1. 6. 17:35

1. 상속

상속부모 클래스의 기능(속성과 메서드)을 자식 클래스가 물려받아 사용할 수 있게 하는 기능입니다.
자식 클래스는 부모 클래스의 속성을 재사용하면서 자신만의 추가적인 기능을 정의할 수 있습니다.
class Burger {
  String? name;

  Burger() {
    print('버거 생성자 호출()');
  }
}

class CheeseBurger extends Burger {
  CheeseBurger() {
    print('치즈버거 생성자 호출()');
  }
}

void main() {
  CheeseBurger ch = CheeseBurger();
}

출력 결과

버거 생성자 호출()
치즈버거 생성자 호출()
  • 부모 생성자 먼저 호출: 부모가 생성되어야 자식이 생성될 수 있습니다.

2. super 키워드

super는 자식 클래스가 부모 클래스의 속성이나 메서드에 접근할 수 있도록 하는 키워드입니다.

super로 부모의 속성 참조하기

class Burger {
  String? name;

  Burger() {
    print('버거 생성자 호출()');
  }
}

class CheeseBurger extends Burger {
  CheeseBurger(String name) {
    print('치즈버거 생성자 호출()');
    super.name = name; // 부모의 name 속성에 값 할당
  }
}

void main() {
  CheeseBurger ch = CheeseBurger('불고기치즈버거');
  print('name 호출: ${ch.name}');
}

출력 결과

버거 생성자 호출()
치즈버거 생성자 호출()
name 호출: 불고기치즈버거​
  • super.name = name: 부모 클래스의 name 속성에 값을 전달합니다.
  • super를 통해 부모 속성을 직접 참조할 수 있습니다.

3. 부모 생성자에 매개변수가 있다면?

부모 클래스에 매개변수가 있는 생성자가 있다면, 자식 클래스에서 이니셜라이저 리스트super 키워드를 통해 값을 전달해야 합니다.

이니셜라이저 리스트와 super

class Burger {
  String? name;

  Burger(String? name) {
    print('버거 생성자 호출()');
    this.name = name;
  }
}

class CheeseBurger extends Burger {
  CheeseBurger(String name) : super(name) {
    print('치즈버거 생성자 호출()');
  }
}

void main() {
  CheeseBurger burger = CheeseBurger('불고기치즈버거');
  print(burger.name);
}

출력 결과

버거 생성자 호출()
치즈버거 생성자 호출()
불고기치즈버거
  • 부모 생성자 호출: super(name)를 통해 부모 클래스의 생성자에 값을 전달합니다.
  • 이니셜라이저 리스트: : super(name) 형식으로 부모 생성자를 호출합니다.

4. 상속과 다형성

다형성하나의 객체가 여러 형태로 동작할 수 있는 성질을 말합니다.
Dart에서는 부모 클래스 타입으로 자식 객체를 참조할 수 있습니다.

class Burger {
  String? name;

  Burger(this.name);
}

class CheeseBurger extends Burger {
  CheeseBurger(String name) : super(name);
}

void main() {
  Burger burger = CheeseBurger('불고기치즈버거');
  print(burger.name); // 부모 타입으로 참조 가능
}

출력 결과

불고기치즈버거

5. 확인 문제

(1) Animal 클래스

class Animal {
  final String name; // final 필드 선언

  Animal(this.name); // 생성자에서 name 초기화
}

(2) Dog 클래스

  • Animal 클래스를 상속.
  • 부모 생성자에 값을 전달하기 위해 이니셜라이저 리스트를 사용.
  • bark() 메서드를 추가해 "멍멍!" 출력.
class Dog extends Animal {
  Dog(String name) : super(name);

  void bark() {
    print('멍멍!');
  }
}

(3) 실행 코드

 
void main() {
  Dog dog1 = Dog('바둑이');
  print(dog1.name);
  dog1.bark();

  Dog dog2 = Dog('흰둥이');
  print(dog2.name);
  dog2.bark();
}

출력 결과

바둑이
멍멍!
흰둥이
멍멍!

6. 정리

상속

  • 자식 클래스는 부모 클래스의 속성과 메서드를 물려받습니다.

super 키워드

  • 부모 클래스의 속성과 메서드에 접근할 때 사용합니다.
  • 부모 생성자 호출에도 사용됩니다.

이니셜라이저 리스트

  • 부모 생성자에 매개변수를 전달할 때 사용됩니다.
 
class Parent {
  Parent(String value) {
    print('Parent 생성자 호출: $value');
  }
}

class Child extends Parent {
  Child(String value) : super(value) {
    print('Child 생성자 호출');
  }
}

void main() {
  Child child = Child('Hello');
}
 
Parent 생성자 호출: Hello
Child 생성자 호출
 
  • 상속: "부모-자식 관계"를 떠올리면 쉽습니다.
  • super: 부모에게 도움을 요청할 때 쓰는 키워드입니다.
  • 다형성: 부모 클래스를 자식 클래스로도 활용할 수 있습니다.