void main() {
  print('------- Idol -------');
  Idol apink = Idol(name: '에이핑크', membersCount: 5);

  apink.sayName();
  apink.sayMembersCount();

  print('-------- Boy Group --------');
  BoyGroup bts = BoyGroup('BTS', 7);

  bts.sayMembersCount();
  bts.sayName();
  bts.sayMale(); // 자식클래스 BoyGroup에만 있는 메소드

  print('-------- Girl Group --------');
  GirlGroup redVelvet = GirlGroup('Red Velvet', 5);

  redVelvet.sayMembersCount();
  redVelvet.sayName();
  redVelvet.sayFemale(); // 자식클래스 GirlGroup에만 있는 메소드
  
  print('-------- Type Comparison : apink(부모) --------');
  print(apink is Idol); // true
  print(apink is BoyGroup); // false
  print(apink is GirlGroup); // false
  
  print('-------- Type Comparison : bts(자식1) --------');
  print(bts is Idol); // true
  print(bts is BoyGroup); // true
  print(bts is GirlGroup); // false
  
  print('-------- Type Comparison : redVelvet(자식2) --------');
  print(redVelvet is Idol); // true
  print(redVelvet is BoyGroup); // false
  print(redVelvet is GirlGroup); // true
}

class Idol {
  String name;
  int membersCount;

  Idol({
    required this.name,
    required this.membersCount,
  });

  void sayName() {
    print('저는 ${this.name}입니다.');
  }

  void sayMembersCount() {
    print('${this.name}은(는) ${this.membersCount}명의 멤버가 있습니다.');
  }
}

class BoyGroup extends Idol {
  BoyGroup(
    String name,
    int membersCount,
  ) : super(
          name: name,
          membersCount: membersCount,
        );

  void sayMale() {
    print('저는 남자 아이돌입니다.');
  }
}

class GirlGroup extends Idol {
  GirlGroup(
    String name,
    int membersCount,
  ) : super(name: name, membersCount: membersCount);

  void sayFemale() {
    print('저는 여자 아이돌입니다.');
  }

}