Dart/OOP

Dart 문법 OOP - 추상

codeJunH 2024. 8. 21. 13:46

추상 클래스란?

추상(abstract)은 상속이나 인터페이스로 사용하는 데 필요한 속성만 정의하고 인스턴스화할 수 없도록 하는 기능이다.

 

추상 클래스의 주요 특징:

  1. 직접 인스턴스화할 수 없다.
  2. 메서드의 선언만 있고 구현은 없을 수 있다 (추상 메서드).
  3. 일반 메서드와 추상 메서드를 모두 포함할 수 있다.
  4. 하위 클래스에서 구현해야 할 메서드를 정의한다.

 

 

Dart에서의 추상 클래스 구현

Dart에서 추상 클래스를 만드는 방법을 살펴보겠다.

앞서 사용했던 Idol 클래스를 추상 클래스로 변경해 보겠다:

여기서 주목해야 할 점:

  1. ① abstract 키워드 사용: 클래스 선언 앞에 abstract 키워드를 붙여 추상 클래스임을 명시한다.
  2. ② 생성자 정의: 추상 클래스도 생성자를 가질 수 있다. 이는 주로 하위 클래스에서 super 키워드를 통해 호출된다.
  3. ③④ 추상 메서드: sayName()과 sayMembersCount()는 본문 없이 선언만 되어 있다. 이러한 메서드를 추상 메서드라고 한다.

 

 

추상 클래스 구현하기

이제 Idol 추상 클래스를 구현(implements)하는 구체적인 클래스를 만들어 보겠다:

이 GirlGroup 클래스는:

  • Idol 추상 클래스의 모든 추상 메서드를 구현해야 한다.
  • 하나라도 구현하지 않으면 컴파일 에러가 발생한다.

 

 

추상 클래스 사용 예시

 

 

추상 클래스의 장점

  1. 코드 재사용: 공통 기능을 추상 클래스에 정의하여 여러 하위 클래스에서 재사용할 수 있다.
  2. 다형성: 추상 클래스 타입의 변수로 다양한 하위 클래스 객체를 참조할 수 있다.
  3. 설계의 유연성: 구체적인 구현을 강제하지 않고 인터페이스만 정의할 수 있다.
  4. 확장성: 새로운 기능을 추가할 때 기존 코드를 변경하지 않고 새 클래스를 추가할 수 있다.

 

 

추상 클래스 vs 인터페이스

Dart에서 추상 클래스와 인터페이스는 매우 유사하지만, 몇 가지 중요한 차이가 있다:

  1. 구현 포함 여부
    • 추상 클래스:
      • 추상 메서드와 구체적인 메서드를 모두 포함할 수 있다.
      • 일부 메서드에 대한 기본 구현을 제공할 수 있다.
    • 인터페이스:
      • Dart에는 별도의 interface 키워드가 없다.
      • 모든 클래스가 암묵적으로 인터페이스 역할을 할 수 있다.
      • 인터페이스로 사용될 때는 모든 메서드가 암묵적으로 추상적으로 간주된다.
    2. 생성자
    • 추상 클래스:
      • 생성자를 가질 수 있다.
      • 이 생성자는 주로 하위 클래스에서 super 키워드를 통해 호출된다.
    • 인터페이스:
      • Dart에서 인터페이스로 사용되는 클래스도 생성자를 가질 수 있다.
      • 그러나 이 생성자는 인터페이스를 구현하는 클래스에서 직접 호출할 수 없다.
    3. 다중 상속 및 구현
    • 추상 클래스:
      • Dart는 단일 상속만을 지원한다.
      • 한 클래스는 오직 하나의 추상 클래스만을 확장(extends)할 수 있다.
    • 인터페이스:
      • 한 클래스는 여러 인터페이스를 동시에 구현(implements)할 수 있다.
      • 이를 통해 다중 인터페이스 구현이 가능하다.

 

 

예시 코드

이 예시에서:

  • Animal은 추상 클래스로, 추상 메서드(makeSound)와 구체적인 메서드(eat)를 모두 가진다.
  • Swimmer는 일반 클래스이지만 인터페이스로 사용된다.
  • Duck 클래스는 Animal을 상속받고 Swimmer 인터페이스를 구현한다.