Dart에서 abstract 키워드는 추상 클래스를 정의할 때 사용됩니다. 추상 클래스는 직접 인스턴스화할 수 없는 클래스로, 다른 클래스들이 상속하여 구현을 완성하도록 강제하는 데 사용됩니다.
추상 클래스(abstract)를 아주 쉽게 말하면?
설계도는 있지만 아직 완성되지 않은 틀 이라고 생각하면 됩니다.
// 추상 클래스: 규칙만 정한 상태
abstract class Chair {
void sit(); // 앉을 수 있어야 한다는 약속
}
이제 다른 사람이 진짜 의자를 만들려면 이 규칙을 따라야 합니다.
// 실제 의자 만들기
class WoodenChair extends Chair {
@override
void sit() {
print("딱딱한 나무 의자에 앉았어요!");
}
}
언제 사용할까?
추상 클래스는 다음과 같은 상황에서 유용하게 사용됩니다:
- 공통된 규칙을 강제하고 싶을 때
예: "모든 탈것은 달릴 수 있어야 한다", "모든 동물은 소리를 낸다" - 여러 클래스가 비슷한 기능을 공유할 때
예: Car, Bike, Bus 모두 move()라는 기능이 있다면 추상 클래스로 묶을 수 있어요 - 일부는 미리 만들고, 일부는 나중에 완성하고 싶을 때
예: 기본 기능은 추상 클래스에서 정의하고, 구체적인 내용은 하위 클래스에서 결정
주요 특징
- 인스턴스화 불가
추상 클래스는 직접 객체를 생성할 수 없습니다. (new를 통해 인스턴스화 불가) - 추상 메서드 포함 가능
메서드 몸체가 없는 메서드(추상 메서드)를 정의할 수 있으며, 이를 하위 클래스에서 구현해야 합니다. - 일반 메서드와 필드도 포함 가능
꼭 모든 메서드가 추상일 필요는 없고, 일반 메서드나 필드도 정의할 수 있습니다.
사용 예제
// 추상 클래스 정의
abstract class Animal {
void makeSound(); // 추상 메서드
void breathe() {
print("숨을 쉰다");
}
}
// 추상 클래스를 상속받아 구현
class Dog extends Animal {
@override
void makeSound() {
print("멍멍!");
}
}
void main() {
// Animal a = Animal(); // 에러! 추상 클래스는 인스턴스화할 수 없음
Dog d = Dog();
d.makeSound(); // 출력: 멍멍!
d.breathe(); // 출력: 숨을 쉰다
}