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
라는 추상 클래스를 사용하고, BoyGroup
과 GirlGroup
두 개의 클래스가 이 추상 클래스를 구현합니다.
추상 클래스는 다른 클래스가 상속하거나 구현할 수 있는, 인스턴스화할 수 없는 클래스입니다. 추상 클래스는 구현된 메서드와 구현되지 않은 추상 메서드를 포함할 수 있습니다. 추상 메서드는 서브클래스에서 반드시 구현해야 하는 메서드입니다.
IdolInterface 추상 클래스:
name
: 아이돌 그룹의 이름을 나타내는 문자열 프로퍼티입니다.sayName()
: 아이돌 그룹의 이름을 출력하는 메서드입니다. 이 메서드는 추상 클래스 내에서 구현되지 않았지만, 구현 클래스에서 반드시 구현해야 합니다.BoyGroup 클래스:
IdolInterface
추상 클래스를 구현합니다.name
: 생성자를 통해 초기화되는 아이돌 그룹의 이름을 나타내는 문자열 프로퍼티입니다.sayName()
: 콘솔에 "제 이름은 [name]입니다." 형식으로 아이돌 그룹의 이름을 출력하는 메서드입니다.GirlGroup 클래스:
IdolInterface
추상 클래스를 구현합니다.name
: 생성자를 통해 초기화되는 아이돌 그룹의 이름을 나타내는 문자열 프로퍼티입니다.sayName()
: 콘솔에 "제 이름은 [name]입니다." 형식으로 아이돌 그룹의 이름을 출력하는 메서드입니다.main
함수에서는 BoyGroup
과 GirlGroup
의 인스턴스를 생성하고, 각 인스턴스의 sayName
메서드를 호출하여 그룹의 이름을 출력합니다.
제 이름은 BTS입니다.
제 이름은 red velvet입니다.
이 예제에서 IdolInterface
는 구체적인 구현을 제공하지 않고, 구현 클래스가 어떤 메서드를 가져야 하는지에 대한 "계약"만 제공합니다. BoyGroup
과 GirlGroup
클래스는 이 계약을 충족하기 위해 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
키워드를 사용하면 클래스가 특정 인터페이스의 모든 메서드를 구현하도록 강제할 수 있습니다.
IdolInterface 추상 클래스 (인터페이스 역할):
name
: 아이돌 그룹의 이름을 나타내는 문자열 프로퍼티입니다.sayName()
: 아이돌 그룹의 이름을 출력하는 메서드입니다. 구체적인 구현이 없으며, 이 추상 클래스를 구현하는 모든 클래스에서 이 메서드를 구현해야 합니다.BoyGroup 클래스 (IdolInterface 인터페이스 구현):
name
: 아이돌 그룹의 이름을 저장하는 문자열 프로퍼티입니다.sayName()
: 콘솔에 아이돌 그룹의 이름을 "제 이름은 [name]입니다." 형식으로 출력하는 메서드입니다.GirlGroup 클래스 (IdolInterface 인터페이스 구현):
name
: 아이돌 그룹의 이름을 저장하는 문자열 프로퍼티입니다.sayName()
: 콘솔에 아이돌 그룹의 이름을 "제 이름은 [name]입니다." 형식으로 출력하는 메서드입니다.main
함수에서는 BoyGroup
과 GirlGroup
클래스의 인스턴스를 생성하고, 각각의 sayName
메서드를 호출하여 아이돌 그룹의 이름을 출력합니다.
이 예제에서 IdolInterface
추상 클래스는 인터페이스 역할을 하며, BoyGroup
과 GirlGroup
클래스는 이 인터페이스를 구현합니다. 이렇게 함으로써, 모든 아이돌 그룹 클래스가 sayName
메서드를 구현하도록 강제할 수 있습니다. 추상 클래스와 인터페이스 구현을 사용하면 코드의 일관성을 유지하고, 다형성을 활용하여 유연하고 확장 가능한 설계를 할 수 있습니다.