1. 상속
상속을 알기 위해선 클래스 개념에 대해 먼저 알아야합니다.
클래스가 기억 안나신다면 여기!
[Dart] 객체지향 프로그래밍: 클래스, 속성, 메서드, 생성자 (Class, Property, Method, Constructor)
1. 클래스 클래스는 설계도입니다. 예를 들어 우리가 게임을 만든다고 생각해 볼게요.먼저 캐릭터가 있어야겠죠? 캐릭터는 이름, 체력, 공격력 같은 속성을 가지고 있고, 공격한다, 점프한다
sfida.tistory.com
개념에 대해 먼저 알려드리자면 상속은 기존 클래스의 기능을 확장하여 새로운 클래스를 만드는 것입니다.
이해하기 쉽게 코드로 설명할게요.
아래 코드는 이전 클래스 포스팅에서 사용했던 Character 클래스입니다.
class Character {
// 속성
String name;
int health;
int attackPower;
// 생성자 (Character 객체를 만들 때 필요한 것들)
Character(this.name, this.health, this.attackPower);
// 행동 (메서드)
void attack() {
print('$name이(가) 공격했습니다! 공격력: $attackPower');
}
void jump() {
print('$name이(가) 점프했습니다!');
}
}
게임 속 캐릭터가 있다고 가정했을 때, 이 Chracter 클래스는 모든 캐릭터가 공통으로 가질 속성과 행동을 정의해둔 기본 클래스입니다.
모든 캐릭터가 같은 속성과 기능을 가지지만, 게임에는 다양한 직업이 있습니다.
전사, 마법사, 암살자 등등...
우리는 이 Chracter 클래스를 상속해서 전사 캐릭터를 만들어 볼거에요.
class Warrior extends Character { // Character 클래스 상속
int defense; // 추가 속성: 방어력
// Warrior의 생성자 (Character의 속성과 추가 속성을 받음)
Warrior(String name, int health, int attackPower, this.defense)
: super(name, health, attackPower);
// Warrior만의 새로운 기능
void defend() {
print('$name이(가) 방패를 들어 방어했습니다! 방어력: $defense');
}
}
class Warrior extends Character 부분을 보시면 extends가 있습니다.
상속을 할 때는 extends 키워드를 사용합니다!
이 부분은 Character 클래스를 상속한 Warrior 클래스라는 뜻이겠죠?
// Warrior의 생성자 (Character의 속성과 추가 속성을 받음)
Warrior(String name, int health, int attackPower, this.defense)
: super(name, health, attackPower);
이 부분은 Warrior의 생성자인데요.
생성자는 객체가 처음 생성될 때 필요한 초기값을 설정하는 역할을 한다고 했었습니다.
Character 클래스의 생성자 부분을 보면 name, health, attackPower만 입력받지만,
Warrior 클래스에서는 추가로 defense를 입력받고 있습니다.
여기서 중요한 부분은 : super(name, health, attackPower)입니다.
super는 부모 클래스의 생성자를 호출하는 키워드입니다.
name, health, attackPower 속성은 부모 (Character) 클래스에 있는 변수이므로,
자식 클래스(Warrior)에서 직접 수정할 권한이 없습니다.
때문에 이 속성들을 초기화 하려면 부모 생성자를 호출해야합니다.
그렇기 때문에 super(name, health, attackPower)로 부모 생성자를 호출하는 것입니다.
하지만, Warrior는 defense 속성을 추가로 받고 있습니다.
그렇기 때문에 this 키워드를 붙여 현재 클래스인 Warrior 클래스의 defense 변수를 초기화해야합니다.
자 이제 만들어둔 Warrior 클래스의 객체를 만들어서 사용해볼게요.
void main() {
Warrior warrior = Warrior('강한 전사', 150, 30, 20);
warrior.attack(); // Character에서 상속받은 기능
warrior.jump(); // Character에서 상속받은 기능
warrior.defend(); // Warrior만의 새로운 기능
}
Character 클래스의 기능을 그대로 물려받으면서도, Warrior만의 새로운 기능(defend)를 추가했습니다.
이를 두고 기능을 확장한다고 말해요.
2. 특징
이 예제를 통해 상속과 부모 클래스, 자식 클래스의 특징을 알아볼게요.
먼저 부모 클래스(슈퍼 클래스)의 모든 속성과 메서드를 자식 클래스(서브 클래스)가 상속받아요.
Character 클래스의 name, health, attackPower 속성과 attack(), jump() 메서드를
Character 클래스를 상속받은 Warrior에서 사용할 수 있는 모습을 확인할 수 있어요.
두 번째로 부모 클래스의 메서드를 자식 클래스에서 변경할 수 있어요.
이를 오버라이딩이라고 말합니다.
자식 클래스에서 부모 클래스의 메서드를 재정의(Overriding) 하면 기존 기능을 유지하면서 새로운 동작을 구현할 수 있습니다.
class Warrior extends Character {
int defense; // 추가 속성: 방어력
// Warrior의 생성자 (Character의 속성과 추가 속성을 받음)
Warrior(String name, int health, int attackPower, this.defense)
: super(name, health, attackPower);
// Warrior만의 새로운 기능
void defend() {
print('$name이(가) 방패를 들어 방어했습니다! 방어력: $defense');
}
@override
void attack() {
print('$name이(가) 강력한 공격을 합니다! 공격력: $attackPower');
}
}
부모 클래스인 Character의 attack()메서드를 자식 클래스인 Warrior 클래스에서 재정의했어요.
재정의할 때는 @override 키워드를 사용합니다.
세 번째로 super를 통해 부모 클래스의 메서드를 자식 클래스에서 호출할 수 있어요.
super 키워드는 부모 클래스의 메서드나 생성자를 호출할 때 사용합니다.
이를 활용하면 부모의 기본 기능을 유지하면서 추가 기능을 넣을 수 있습니다.
class Warrior extends Character {
int defense; // 추가 속성: 방어력
// Warrior의 생성자 (Character의 속성과 추가 속성을 받음)
Warrior(String name, int health, int attackPower, this.defense)
: super(name, health, attackPower);
// Warrior만의 새로운 기능
void defend() {
print('$name이(가) 방패를 들어 방어했습니다! 방어력: $defense');
}
@override
void attack() {
super.attack(); // 부모 클래스의 attack() 호출
print('name이(가) 강력한 공격을 합니다! 공격력: $attackPower');
}
}
// 강한 전사이(가) 공격했습니다! 공격력: 30
// name이(가) 강력한 공격을 합니다! 공격력: 30
하지만, 만약 상속을 허용하지 않게 하고 싶다면 final 키워드를 사용합니다.
final은 하나의 클래스로부터 자식 클래스를 만들 수 없도록 하는 것이에요.
쉽게 말해서 상속 받을 수 없도록 하는 키워드입니다.
final class Character {
// 속성
String name;
int health;
int attackPower;
// 생성자 (Character 객체를 만들 때 필요한 것들)
Character(this.name, this.health, this.attackPower);
// 행동 (메서드)
void attack() {
print('$name이(가) 공격했습니다! 공격력: $attackPower');
}
void jump() {
print('$name이(가) 점프했습니다!');
}
}
'Dart' 카테고리의 다른 글
| [Dart] JSON 직렬화, 역직렬화 (0) | 2025.04.10 |
|---|---|
| [Dart] 예외 처리 (Error Handling) (0) | 2025.03.17 |
| [Dart] 객체지향 프로그래밍: 클래스, 속성, 메서드, 생성자 (Class, Property, Method, Constructor) (0) | 2025.03.13 |
| [Dart] 함수형 프로그래밍 (Functional Programming) (0) | 2025.03.12 |
| [Dart] 제네릭 (Generics) - 제네릭 함수 & 클래스 (0) | 2025.03.12 |