이번에는 Dart 프로그래밍 언어의 상속(Inheritance)과 다형성(Polymorphism)에 대한 개념을 설명하고, 이들을 사용함에 있어 이해하기 쉽게 예시 코드를 통해 이러한 개념을 학습할 수 있도록 작성되었습니다. 코드 재사용성을 높이고, 다양한 형태의 객체를 다룰 수 있는 다형성의 장점을 설명하여 Dart의 객체 지향 프로그래밍의 기본을 학습할 수 있도록 정리해 봤습니다.
Dart 상속과 다형성
상속 (Inheritance)
상속은 코드 재사용성을 높이기 위한 객체 지향 프로그래밍의 주요 개념입니다. 상속을 통해 기존 클래스의 속성과 메서드를 새로운 클래스에 물려받을 수 있습니다. 이렇게 하면 코드 중복을 줄일 수 있고, 새로운 클래스에 추가적인 기능을 더할 수 있습니다.
예시 코드
// 부모 클래스 (Super Class)
class Animal {
String name;
int age;
Animal(this.name, this.age);
void eat() {
print('$name is eating.');
}
}
// 자식 클래스 (Sub Class)
class Dog extends Animal {
String breed;
Dog(String name, int age, this.breed) : super(name, age);
void bark() {
print('$name is barking.');
}
}
void main() {
Dog dog = Dog('Buddy', 3, 'Labrador');
dog.eat(); // Buddy is eating.
dog.bark(); // Buddy is barking.
}
위 예시에서 Dog 클래스는 Animal 클래스를 상속받고 있습니다. Dog 클래스는 Animal 클래스의 name 과 age 속성, eat() 메서드를 물려받았습니다. 또한 breed 속성과 bark() 메서드를 추가로 정의했습니다.
주요 키워드
- extends : 클래스 상속을 위한 키워드입니다.
- super : 부모 클래스의 생성자를 호출하거나 부모 클래스의 속성과 메서드에 접근할 때 사용합니다.
다형성 (Polymorphism)
다형성은 하나의 객체가 여러 가지 형태를 가질 수 있다는 의미입니다. 이를 통해 코드의 유연성과 재사용성을 높일 수 있습니다. Dart에서는 메서드 오버라이딩과 매개변수 다형성을 지원합니다
.
메서드 오버라이딩 (Method Overriding)
자식 클래스에서 부모 클래스의 메서드를 재정의하는 것을 말합니다. 이렇게 하면 동일한 메서드 이름을 사용하더라도 각 클래스에 맞는 독립적인 동작을 정의할 수 있습니다.
class Animal {
void makeSound() {
print('The animal makes a sound.');
}
}
class Dog extends Animal {
void makeSound() {
print('The dog barks.');
}
}
class Cat extends Animal {
void makeSound() {
print('The cat meows.');
}
}
void main() {
Animal animal = Animal();
animal.makeSound(); // The animal makes a sound.
Dog dog = Dog();
dog.makeSound(); // The dog barks.
Cat cat = Cat();
cat.makeSound(); // The cat meows.
}
위 예시에서 Dog 와 Cat 클래스는 Animal 클래스의 makeSound() 메서드를 각각 오버라이딩하여 독립적인 동작을 정의했습니다.
매개변수 다형성 (Parametric Polymorphism)
하나의 엔티티(함수 또는 클래스)가 다양한 타입의 객체를 허용하는 것을 말합니다. Dart에서는 제네릭(Generics)을 통해 매개변수 다형성을 구현합니다.
class Box<T> {
T item;
Box(this.item);
T getItem() {
return item;
}
}
void main() {
Box<int> boxInt = Box<int>(10);
int intItem = boxInt.getItem(); // intItem = 10
Box<String> boxString = Box<String>('Hello');
String stringItem = boxString.getItem(); // stringItem = 'Hello'
}
위 예시에서 Box 클래스는 제네릭 T 를 사용하여 다양한 타입의 객체를 허용합니다. Box<int> 는 정수 타입의 객체를, Box<String> 은 문자열 타입의 객체를 다룰 수 있습니다.
이와 같이 Dart에서는 상속과 다형성을 통해 코드의 재사용성과 유연성을 높일 수 있습니다.
'프로그래밍 언어 > Dart' 카테고리의 다른 글
Dart에서 믹스인과 익스텐션 사용법: 다중 상속과의 차이점 - Dart 기초 #12 (0) | 2024.06.14 |
---|---|
Dart에서 추상 클래스와 인터페이스 사용 방법, 클래스 상속과 구현 가이드 - Dart 기초 #11 (0) | 2024.06.13 |
Dart 객체지향 프로그래밍: 생성자와 소멸자 개념과 예제 - Dart 기초 #9 (0) | 2024.06.11 |
Dart 객체지향 프로그래밍: 클래스와 객체 이해하기 - Dart 기초 #8 (0) | 2024.06.10 |
Dart 프로그래밍 입문자를 위한 함수와 메소드 정의 및 사용법 - Dart 기초 #7 (0) | 2024.06.08 |