[Flutter/Dart] 추상 클래스(abstract class) 쉽게 이해하기

Dart에서 abstract 키워드는 추상 클래스를 정의할 때 사용됩니다. 추상 클래스는 직접 인스턴스화할 수 없는 클래스로, 다른 클래스들이 상속하여 구현을 완성하도록 강제하는 데 사용됩니다.

 

 

추상 클래스(abstract)를 아주 쉽게 말하면?

설계도는 있지만 아직 완성되지 않은 틀 이라고 생각하면 됩니다.

// 추상 클래스: 규칙만 정한 상태
abstract class Chair {
  void sit(); // 앉을 수 있어야 한다는 약속
}

이제 다른 사람이 진짜 의자를 만들려면 이 규칙을 따라야 합니다.

// 실제 의자 만들기
class WoodenChair extends Chair {
  @override
  void sit() {
    print("딱딱한 나무 의자에 앉았어요!");
  }
}

 

 

언제 사용할까?

추상 클래스는 다음과 같은 상황에서 유용하게 사용됩니다:

  1. 공통된 규칙을 강제하고 싶을 때
    예: "모든 탈것은 달릴 수 있어야 한다", "모든 동물은 소리를 낸다"
  2. 여러 클래스가 비슷한 기능을 공유할 때
    예: Car, Bike, Bus 모두 move()라는 기능이 있다면 추상 클래스로 묶을 수 있어요
  3. 일부는 미리 만들고, 일부는 나중에 완성하고 싶을 때
    예: 기본 기능은 추상 클래스에서 정의하고, 구체적인 내용은 하위 클래스에서 결정

 

 

주요 특징

  1. 인스턴스화 불가
    추상 클래스는 직접 객체를 생성할 수 없습니다. (new를 통해 인스턴스화 불가)
  2. 추상 메서드 포함 가능
    메서드 몸체가 없는 메서드(추상 메서드)를 정의할 수 있으며, 이를 하위 클래스에서 구현해야 합니다.
  3. 일반 메서드와 필드도 포함 가능
    꼭 모든 메서드가 추상일 필요는 없고, 일반 메서드나 필드도 정의할 수 있습니다.

 

 

사용 예제

// 추상 클래스 정의
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();   // 출력: 숨을 쉰다
}