제네릭 클래스
Coddy Dart 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 110개 중 65번째.
Dart에 내장된 List<String> 같은 컬렉션이 타입 매개변수를 사용하는 것을 살펴보았습니다. 이제 지정한 모든 타입에서 작동하는 자신만의 제네릭 클래스를 만들어 볼 차례입니다.
제네릭 클래스는 인스턴스를 생성할 때 제공될 실제 타입을 위한 자리 표시자로 타입 매개변수(일반적으로 T)를 사용합니다:
class Box<T> {
T content;
Box(this.content);
T getContent() => content;
}
void main() {
var stringBox = Box<String>('Hello');
var intBox = Box<int>(42);
print(stringBox.getContent()); // Hello
print(intBox.getContent()); // 42
}T는 타입 변수로 작동합니다. Box<String>을 생성하면 클래스의 모든 T가 String이 됩니다. 이를 통해 각 타입마다 별도의 클래스를 작성하지 않고도 타입 안전성을 확보할 수 있습니다.
클래스가 둘 이상의 타입과 함께 작동해야 할 때 여러 타입 매개변수를 사용할 수 있습니다:
class Pair<K, V> {
K first;
V second;
Pair(this.first, this.second);
}
void main() {
var pair = Pair<String, int>('age', 25);
print('${pair.first}: ${pair.second}'); // age: 25
}제네릭 클래스는 재사용 가능하고 타입 안전한 코드의 기반입니다. 서로 다른 타입에 대해 로직을 중복해서 작성하거나 dynamic으로 타입 정보를 잃는 대신, 제네릭을 사용하면 컴파일러가 여전히 검증할 수 있는 유연한 코드를 작성할 수 있습니다.
챌린지
쉬움다양한 유형의 항목을 위한 유연한 컨테이너를 만들기 위해 generic 클래스를 사용하는 선물 포장 시스템을 만들어 봅시다. 모든 유형의 content를 포장할 수 있는 generic Wrapper 클래스와, gift와 card 메시지를 pair하기 위한 두 개의 type parameter를 가진 GiftBox 클래스를 만듭니다.
코드를 두 개의 파일로 구성합니다:
wrapper.dart: 여기에서 generic 클래스를 Define합니다:Wrapper<T>generic 클래스에는T contentProperty와 Constructor가 있습니다. content를 returns하는unwrap()Method와Wrapped: [content]를 prints하는describe()Method를 포함하세요.GiftBox<G, C>generic 클래스에는 두 개의 Properties가 있습니다:G gift와C card. Constructor와 한 줄에Gift: [gift]를 prints하고 다음 줄에Card: [card]를 prints하는open()Method를 포함하세요.
main.dart: wrapper 파일을 import하고 서로 다른 type으로 generic 클래스를 보여 주세요:'Chocolate'를 containing하는Wrapper<String>을 Create하고describe()를 call하세요.42를 containing하는Wrapper<int>을 Create하고describe()를 call하세요.3.14를 containing하는Wrapper<double>을 Create하고describe()를 call하세요.- empty line을 Print하세요.
- gift가
'Teddy Bear'이고 card가'Happy Birthday!'인GiftBox<String, String>을 Create한 다음open()을 call하세요. - empty line을 Print하세요.
- gift가 gift card amount를 나타내는
100이고 card가'Congratulations!'인GiftBox<int, String>을 Create한 다음open()을 call하세요.
동일한 Wrapper 클래스가 strings, integers, doubles와 원활하게 작동하는 것을 확인하세요. GiftBox 클래스는 두 개의 type parameter를 사용하여 서로 다른 type을 pair하는 방법을 보여 줍니다. gift는 어떤 type이든 될 수 있는 반면 card 메시지는 string으로 유지됩니다.
Expected output:
Wrapped: Chocolate
Wrapped: 42
Wrapped: 3.14
Gift: Teddy Bear
Card: Happy Birthday!
Gift: 100
Card: Congratulations!직접 해보기
import 'wrapper.dart';
void main() {
// TODO: 'Chocolate'을 포함하는 Wrapper<String>을 생성하고 describe()를 호출하세요
// TODO: 42를 포함하는 Wrapper<int>을 생성하고 describe()를 호출하세요
// TODO: 3.14를 포함하는 Wrapper<double>을 생성하고 describe()를 호출하세요
// TODO: 빈 줄을 출력하세요
// TODO: Create a GiftBox<String, String> with gift 'Teddy Bear'
// and card 'Happy Birthday!', then call open()
// TODO: 빈 줄을 출력하세요
// TODO: gift 100인 GiftBox<int, String>을 생성하세요
// and card 'Congratulations!', then call open()
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
객체 지향 프로그래밍의 모든 레슨
직접 연습해 보세요: 온라인 Dart 컴파일러