다트의 상속(Inheritance)은 어떻게 구현하나요?
_____A1: 다트에서는 클래스 뒤에 콜론(:)과 부모 클래스 이름을 적어서 상속을 구현합니다. 예를 들어 `class Child extends Parent { }` 형태로 상속 관계를 지정할 수 있습니다.
---
Q2: 다트에서 상속 문법 기본 예시는?
A2:
```dart
class Animal {
void eat() {
print('먹는다');
}
}
class Dog extends Animal {
void bark() {
print('짖는다');
}
}
void main() {
Dog dog = Dog();
dog.eat(); // 부모 클래스 메서드 호출 가능
dog.bark();
}
```
---
Q3: 다트에서 다중 상속이 가능한가요?
A3: 기본적으로 클래스는 단일 상속만 가능하지만, `mixin`이나 `implements` 키워드를 사용해 다중 인터페이스 구현이나 믹스인 기능을 활용할 수 있습니다.
---
Q4: super 키워드는 어떻게 사용하나요?
A4: `super`는 부모 클래스의 생성자나 메서드, 필드를 참조할 때 사용합니다. 예를 들어, 자식 생성자에서 부모 생성자를 호출할 때 `super()`를 쓸 수 있습니다.
```dart
class Parent {
Parent(String name) {
print('부모 생성자: $name');
}
}
class Child extends Parent {
Child(String name) : super(name) {
print('자식 생성자');
}
}
```
Q5: 오버라이딩(재정의)은 어떻게 하나요?
A5: 부모 클래스의 메서드를 자식 클래스에서 재정의할 때는 `@override` 어노테이션을 붙입니다.
```dart
class Animal {
void speak() {
print('동물이 소리낸다');
}
}
class Dog extends Animal {
@override
void speak() {
print('멍멍');
}
}
```
---
Q6: 다트에서 abstract 클래스와 상속은 어떤 관계인가요?
A6: `abstract` 키워드로 선언한 추상 클래스는 인스턴스화할 수 없으며 상속을 통해 자식 클래스에서 반드시 구현해야 하는 메서드를 정의할 수 있습니다.
```dart
abstract class Animal {
void makeSound();
}
class Cat extends Animal {
@override
void makeSound() {
print('야옹');
}
}
```
---
Q7: 부모 클래스 메서드를 호출하면서 확장하는 방법은?
A7: 자식 메서드 안에서 `super.메서드명()`을 호출하여 부모 클래스 메서드를 실행한 후 기능을 추가할 수 있습니다.
```dart
@override
void speak() {
super.speak();
print('추가 동작');
}
```
---
요약하면, 다트 상속은 `extends` 키워드를 사용해 단일 클래스 상속을 구현하며, 생성자, 메서드 오버라이딩, `super` 키워드를 통해 부모 클래스의 기능을 확장할 수 있습니다. 다중 상속은 `mixin`과 `implements`로 보완합니다.
상속을 통해 한 클래스(자식 클래스)가 다른 클래스(부모 클래스)의 속성과 메서드를 물려받을 수 있습니다.
이를 통해 코드의 중복을 줄이고, 더 구조화된 프로그램을 작성할 수 있습니다.
기본적인 상속 구현 다트에서 상속을 구현하는 기본적인 방법은 `extends` 키워드를 사용하는 것입니다.
아래는 상속을 사용하는 간단한 예제입니다.
```dart // 부모 클래스 class Animal { void speak() { print("Animal speaks"); } } // 자식 클래스 class Dog extends Animal { @override void speak() { print("Dog barks"); } } void main() { Dog dog = Dog(); dog.speak(); // 출력: Dog barks Animal animal = Animal(); animal.speak(); // 출력: Animal speaks } ``` 위의 예제에서 `Animal` 클래스는 기본적인 `speak` 메서드를 가지고 있습니다.
`Dog` 클래스는 `Animal` 클래스를 상속받아 `speak` 메서드를 오버라이드(재정의)하여 개가 짖는 소리를 출력하도록 구현했습니다.
생성자와 상속 부모 클래스의 생성자를 자식 클래스에서 호출할 수 있습니다.
이를 통해 부모 클래스의 속성을 초기화할 수 있습니다.
아래는 생성자를 사용하는 예제입니다.
```dart class Animal { String name; Animal(this.name); // 생성자 void speak() { print("$name speaks"); } } class Dog extends Animal { Dog(String name) : super(name); // 부모 클래스의 생성자 호출 @override void speak() { print("$name barks"); } } void main() { Dog dog = Dog("Buddy"); dog.speak(); // 출력: Buddy barks } ``` 위의 예제에서 `Animal` 클래스는 이름을 받는 생성자를 가지고 있습니다.
`Dog` 클래스는 부모 클래스의 생성자를 호출하여 이름을 초기화합니다.
다중 상속 다트는 다중 상속을 지원하지 않습니다.
즉, 하나의 클래스가 여러 부모 클래스를 상속받을 수 없습니다.
그러나 다트는 믹스인(Mixin)이라는 기능을 제공하여 비슷한 기능을 구현할 수 있습니다.
믹스인은 다른 클래스에 기능을 추가할 수 있는 방법입니다.
```dart mixin Swimmer { void swim() { print("Swimming"); } } class Animal { void speak() { print("Animal speaks"); } } class Dog extends Animal with Swimmer { @override void speak() { print("Dog barks"); } } void main() { Dog dog = Dog(); dog.speak(); // 출력: Dog barks dog.swim(); // 출력: Swimming } ``` 위의 예제에서 `Swimmer` 믹스인은 `swim` 메서드를 정의하고, `Dog` 클래스는 `Animal` 클래스를 상속받고 `Swimmer` 믹스인을 사용하여 수영 기능을 추가했습니다.
상속의 장점과 단점 장점 1. 코드 재사용 : 공통된 기능을 부모 클래스에 정의하고 자식 클래스에서 재사용할 수 있습니다.
2. 유지보수 용이 : 부모 클래스의 기능을 수정하면 자식 클래스에도 자동으로 반영됩니다.
3. 다형성 : 부모 클래스 타입으로 자식 클래스 객체를 다룰 수 있어 유연한 코드 작성이 가능합니다.
단점 1. 복잡성 증가 : 상속 구조가 복잡해질 경우, 코드의 이해와 유지보수가 어려워질 수 있습니다.
2. 강한 결합 : 자식 클래스가 부모 클래스에 강하게 의존하게 되어, 부모 클래스의 변경이 자식 클래스에 영향을 미칠 수 있습니다.
결론 다트에서 상속은 객체 지향 프로그래밍의 중요한 개념으로, 코드의 재사용성과 유지보수성을 높이는 데 큰 도움이 됩니다.
상속을 적절히 활용하면 더 구조화된 프로그램을 작성할 수 있지만, 상속 구조가 복잡해지지 않도록 주의해야 합니다.
믹스인과 같은 기능을 통해 다중 상속의 필요성을 해결할 수 있는 점도 다트의 장점 중 하나입니다.
작성자:
박재현 [비회원]
| 작성일자: 1년 전
2024-09-19 01:52:34
조회수: 149 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
조회수: 149 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
내용이 부정확하다면 싫어요를 클릭해주세요.