관리 메뉴

IT Story

Dart Abstract 본문

Programming/Dart

Dart Abstract

#root 2025. 3. 28. 14:16

Dart에서 추상 클래스(Abstract Class)추상 메서드(Abstract Method) 는 객체 지향 프로그래밍에서 중요한 개념입니다. 추상 클래스는 인스턴스를 직접 생성할 수 없으며, 주로 다른 클래스들이 상속받아 사용할 기본 틀을 제공합니다. 추상 메서드는 본문(구현부)이 없는 메서드로, 이를 포함하는 클래스는 반드시 추상 클래스여야 합니다.


1. Dart 추상 클래스(Abstract Class)란?

추상 클래스는 abstract 키워드를 사용하여 선언됩니다.
이는 일반 클래스로는 인스턴스를 생성할 수 없으며, 반드시 상속받은 클래스에서 구현해야 하는 메서드를 정의하는 용도로 사용됩니다.

추상 클래스의 특징

  1. 객체 생성 불가 - 추상 클래스 자체로는 객체를 생성할 수 없습니다.
  2. 추상 메서드 포함 가능 - 본문이 없는 메서드를 포함할 수 있으며, 이를 반드시 서브클래스에서 구현해야 합니다.
  3. 일반 메서드 및 변수 포함 가능 - 추상 클래스는 일반 메서드와 변수를 가질 수 있습니다.
  4. 다른 클래스가 이를 상속받아 구현하도록 강제 - 공통적인 인터페이스 역할을 합니다.

2. 추상 클래스와 추상 메서드 예제

추상 클래스와 추상 메서드를 활용하는 기본적인 예제를 살펴보겠습니다.

(1) 기본적인 추상 클래스 및 추상 메서드 예제

// 추상 클래스 정의
abstract class Animal {
  // 추상 메서드 (구현부 없음)
  void makeSound();

  // 일반 메서드 (구현부 있음)
  void eat() {
    print("음식을 먹습니다.");
  }
}

// 서브 클래스에서 추상 메서드 구현
class Dog extends Animal {
  @override
  void makeSound() {
    print("멍멍!");
  }
}

class Cat extends Animal {
  @override
  void makeSound() {
    print("야옹!");
  }
}

void main() {
  // Animal 클래스는 추상 클래스이므로 인스턴스를 직접 생성할 수 없음
  // Animal animal = Animal(); // 오류 발생!

  Dog dog = Dog();
  dog.makeSound(); // "멍멍!"
  dog.eat();      // "음식을 먹습니다."

  Cat cat = Cat();
  cat.makeSound(); // "야옹!"
  cat.eat();      // "음식을 먹습니다."
}

설명

  • Animal 클래스는 abstract 키워드를 사용하여 선언된 추상 클래스입니다.
  • makeSound() 메서드는 본문이 없으므로 추상 메서드이며, 이를 반드시 하위 클래스에서 구현해야 합니다.
  • eat() 메서드는 일반 메서드이므로 하위 클래스에서 재정의하지 않아도 사용할 수 있습니다.
  • Dog 와 Cat 클래스는 Animal 클래스를 상속받아 makeSound() 메서드를 구현하였습니다.

(2) 추상 클래스가 여러 개의 서브 클래스를 가지는 예제

abstract class Vehicle {
  // 추상 메서드 (각 차량마다 다르게 구현)
  void move();
}

class Car extends Vehicle {
  @override
  void move() {
    print("자동차가 도로 위를 달립니다.");
  }
}

class Airplane extends Vehicle {
  @override
  void move() {
    print("비행기가 하늘을 날아갑니다.");
  }
}

class Boat extends Vehicle {
  @override
  void move() {
    print("배가 물 위를 떠다닙니다.");
  }
}

void main() {
  Car car = Car();
  car.move(); // "자동차가 도로 위를 달립니다."

  Airplane airplane = Airplane();
  airplane.move(); // "비행기가 하늘을 날아갑니다."

  Boat boat = Boat();
  boat.move(); // "배가 물 위를 떠다닙니다."
}

설명

  • Vehicle 추상 클래스는 move()라는 추상 메서드를 가지고 있습니다.
  • Car, Airplane, Boat 클래스가 Vehicle 클래스를 상속받아 각기 다른 방식으로 move() 메서드를 구현합니다.
  • move()는 각 클래스에서 고유한 방식으로 재정의되어 사용됩니다.

(3) 추상 클래스에 일반 메서드와 변수 포함

abstract class Employee {
  String name;
  int salary;

  Employee(this.name, this.salary);

  // 추상 메서드
  void work();

  // 일반 메서드
  void showSalary() {
    print("$name의 월급은 $salary 원입니다.");
  }
}

class Developer extends Employee {
  Developer(String name, int salary) : super(name, salary);

  @override
  void work() {
    print("$name이(가) 코드를 작성하고 있습니다.");
  }
}

class Designer extends Employee {
  Designer(String name, int salary) : super(name, salary);

  @override
  void work() {
    print("$name이(가) 디자인을 그리고 있습니다.");
  }
}

void main() {
  Developer dev = Developer("철수", 5000000);
  dev.work(); // "철수이(가) 코드를 작성하고 있습니다."
  dev.showSalary(); // "철수의 월급은 5000000 원입니다."

  Designer des = Designer("영희", 4000000);
  des.work(); // "영희이(가) 디자인을 그리고 있습니다."
  des.showSalary(); // "영희의 월급은 4000000 원입니다."
}

설명

  • Employee 추상 클래스는 name과 salary 변수를 가지고 있으며, 생성자를 정의하여 이를 초기화합니다.
  • work() 메서드는 추상 메서드로 선언되어 서브클래스에서 반드시 구현해야 합니다.
  • showSalary()는 일반 메서드로, 각 직원의 월급을 출력합니다.
  • Developer 와 Designer 클래스는 Employee를 상속받고, work()를 각각 다르게 구현했습니다.

3. 추상 클래스를 사용하는 이유

코드의 재사용성 증가

  • 중복되는 코드(일반 메서드, 변수)를 한 곳에서 정의하고 상속받아 사용할 수 있습니다.

일관성 유지

  • 특정 메서드(move(), work() 등)를 반드시 구현하도록 강제하여, 클래스를 일관되게 사용할 수 있습니다.

유지보수 및 확장 용이

  • 새로운 기능을 추가할 때 공통적인 기능은 부모 클래스에 추가하고, 개별적인 기능은 서브클래스에서 구현할 수 있습니다.

 

4. 인터페이스와의 차이점

Dart에서는 추상 클래스 외에도 인터페이스(interface) 역할을 하는 것이 가능합니다.
Dart에는 interface 키워드가 없지만, 클래스를 implements 키워드를 사용하여 인터페이스처럼 사용할 수 있습니다.

  • 추상 클래스(abstract class)
    • extends 키워드를 사용하여 상속.
    • 일반 메서드와 변수를 포함할 수 있음.
    • 단일 상속만 가능.
  • 인터페이스(implements 활용)
    • implements 키워드를 사용하여 여러 개의 클래스를 구현할 수 있음.
    • 모든 메서드를 강제로 오버라이드해야 함.

 

5. 결론

Dart의 추상 클래스추상 메서드는 코드의 구조를 정리하고, 유지보수성을 높이며, 중복을 줄이는 중요한 개념입니다.
이를 활용하면 객체 지향 프로그래밍의 강력한 기능을 활용할 수 있으며, 일관된 인터페이스를 제공하는 역할을 합니다.

추상 클래스를 활용하여 효율적인 코드 구조를 설계해 보세요! 🚀

'Programming > Dart' 카테고리의 다른 글

Dart Static  (0) 2025.04.03
Dart Generic  (0) 2025.04.03
Dart Mixins  (0) 2025.03.28
Dart Interface  (0) 2025.03.27
Dart Override  (0) 2025.03.27