Dart 언어 오답노트 : 26. abstract class와 interface

샤워실의 바보·2023년 10월 26일
0
post-thumbnail
void main() {
  BoyGroup bts = BoyGroup('BTS');
  GirlGroup redVelvet = GirlGroup('red velvet');
  
  bts.sayName();
  redVelvet.sayName();
}

abstract class IdolInterface {
  String name;
  
  IdolInterface(
    this.name,
  );
  
  void sayName();
}


class BoyGroup implements IdolInterface {
    String name;
  
  BoyGroup(
    this.name,
  );
  
  
  void sayName() {
    print('제 이름은 $name입니다.');
  }
}

class GirlGroup implements IdolInterface {
    String name;
  
  GirlGroup(
    this.name,
  );
  
  
  void sayName() {
    print('제 이름은 $name입니다.');
  }
}

이 코드 예제에서는 Dart의 추상 클래스와 인터페이스 구현을 사용하여 아이돌 그룹을 모델링하는 방법을 보여줍니다. 이 예제에서는 IdolInterface라는 추상 클래스를 사용하고, BoyGroupGirlGroup 두 개의 클래스가 이 추상 클래스를 구현합니다.

추상 클래스 (abstract class)

추상 클래스는 다른 클래스가 상속하거나 구현할 수 있는, 인스턴스화할 수 없는 클래스입니다. 추상 클래스는 구현된 메서드와 구현되지 않은 추상 메서드를 포함할 수 있습니다. 추상 메서드는 서브클래스에서 반드시 구현해야 하는 메서드입니다.

클래스 설명

  1. IdolInterface 추상 클래스:

    • name: 아이돌 그룹의 이름을 나타내는 문자열 프로퍼티입니다.
    • sayName(): 아이돌 그룹의 이름을 출력하는 메서드입니다. 이 메서드는 추상 클래스 내에서 구현되지 않았지만, 구현 클래스에서 반드시 구현해야 합니다.
  2. BoyGroup 클래스:

    • IdolInterface 추상 클래스를 구현합니다.
    • name: 생성자를 통해 초기화되는 아이돌 그룹의 이름을 나타내는 문자열 프로퍼티입니다.
    • sayName(): 콘솔에 "제 이름은 [name]입니다." 형식으로 아이돌 그룹의 이름을 출력하는 메서드입니다.
  3. GirlGroup 클래스:

    • IdolInterface 추상 클래스를 구현합니다.
    • name: 생성자를 통해 초기화되는 아이돌 그룹의 이름을 나타내는 문자열 프로퍼티입니다.
    • sayName(): 콘솔에 "제 이름은 [name]입니다." 형식으로 아이돌 그룹의 이름을 출력하는 메서드입니다.

main 함수

main 함수에서는 BoyGroupGirlGroup의 인스턴스를 생성하고, 각 인스턴스의 sayName 메서드를 호출하여 그룹의 이름을 출력합니다.

출력 결과

제 이름은 BTS입니다.
제 이름은 red velvet입니다.

이 예제에서 IdolInterface는 구체적인 구현을 제공하지 않고, 구현 클래스가 어떤 메서드를 가져야 하는지에 대한 "계약"만 제공합니다. BoyGroupGirlGroup 클래스는 이 계약을 충족하기 위해 sayName 메서드를 구현합니다.

추상 클래스를 사용하면 인터페이스처럼 메서드의 시그너처를 정의할 수 있고, 필요한 경우 일부 메서드에 대한 기본 구현을 제공할 수 있습니다. 이 예제에서는 sayName 메서드에 대한 기본 구현이 없지만, 필요하다면 추상 클래스 내에서 기본 구현을 제공할 수 있습니다.이 코드 예제에서는 Dart의 추상 클래스와 인터페이스 구현 개념을 활용하여 아이돌 그룹을 모델링하는 방법을 보여줍니다. 추상 클래스는 일종의 인터페이스 역할을 할 수 있지만, Dart에서는 implements 키워드를 사용하여 인터페이스 구현의 개념을 더 명확하게 표현할 수 있습니다.

추상 클래스에서의 메서드

Dart의 추상 클래스에서 추상 메서드를 선언할 때는 메서드 본문을 제공하지 않고 세미콜론으로 끝내야 합니다.

예를 들어, Shape 추상 클래스의 draw 메서드는 다음과 같이 정의됩니다:

abstract class Shape {
  void draw();
  // ...
}

다만, 추상 클래스의 메서드 끝에 빈 중괄호 사용은 가능하나, 대부분 세미콜론을 사용합니다.

abstract class Test {
  void test() {}
}

class Test2 implements Test {
  
  void test() {
    print('Hello world');
  }
}

추상 클래스와 인터페이스

Dart에서 추상 클래스는 다른 클래스에서 상속하거나 구현할 수 있는 클래스로, 인스턴스를 만들 수 없습니다. 추상 클래스는 인터페이스처럼 동작할 수 있으며, 클래스가 특정 메서드를 구현하도록 강제할 수 있습니다. 또한, 추상 클래스는 일부 메서드에 대한 기본 구현을 제공할 수 있습니다.

인터페이스는 다른 클래스가 구현해야 하는 메서드의 집합을 정의하는 역할을 합니다. Dart에서는 별도의 interface 키워드가 없지만, 모든 클래스는 기본적으로 인터페이스 역할을 할 수 있습니다. implements 키워드를 사용하면 클래스가 특정 인터페이스의 모든 메서드를 구현하도록 강제할 수 있습니다.

클래스 설명

  1. IdolInterface 추상 클래스 (인터페이스 역할):

    • name: 아이돌 그룹의 이름을 나타내는 문자열 프로퍼티입니다.
    • sayName(): 아이돌 그룹의 이름을 출력하는 메서드입니다. 구체적인 구현이 없으며, 이 추상 클래스를 구현하는 모든 클래스에서 이 메서드를 구현해야 합니다.
  2. BoyGroup 클래스 (IdolInterface 인터페이스 구현):

    • name: 아이돌 그룹의 이름을 저장하는 문자열 프로퍼티입니다.
    • sayName(): 콘솔에 아이돌 그룹의 이름을 "제 이름은 [name]입니다." 형식으로 출력하는 메서드입니다.
  3. GirlGroup 클래스 (IdolInterface 인터페이스 구현):

    • name: 아이돌 그룹의 이름을 저장하는 문자열 프로퍼티입니다.
    • sayName(): 콘솔에 아이돌 그룹의 이름을 "제 이름은 [name]입니다." 형식으로 출력하는 메서드입니다.

main 함수

main 함수에서는 BoyGroupGirlGroup 클래스의 인스턴스를 생성하고, 각각의 sayName 메서드를 호출하여 아이돌 그룹의 이름을 출력합니다.

결론

이 예제에서 IdolInterface 추상 클래스는 인터페이스 역할을 하며, BoyGroupGirlGroup 클래스는 이 인터페이스를 구현합니다. 이렇게 함으로써, 모든 아이돌 그룹 클래스가 sayName 메서드를 구현하도록 강제할 수 있습니다. 추상 클래스와 인터페이스 구현을 사용하면 코드의 일관성을 유지하고, 다형성을 활용하여 유연하고 확장 가능한 설계를 할 수 있습니다.

profile
공부하는 개발자

0개의 댓글