Menu
Coddy logo textTech

제네릭 클래스

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>을 생성하면 클래스의 모든 TString이 됩니다. 이를 통해 각 타입마다 별도의 클래스를 작성하지 않고도 타입 안전성을 확보할 수 있습니다.

클래스가 둘 이상의 타입과 함께 작동해야 할 때 여러 타입 매개변수를 사용할 수 있습니다:

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으로 타입 정보를 잃는 대신, 제네릭을 사용하면 컴파일러가 여전히 검증할 수 있는 유연한 코드를 작성할 수 있습니다.

challenge icon

챌린지

쉬움

다양한 유형의 항목을 위한 유연한 컨테이너를 만들기 위해 generic 클래스를 사용하는 선물 포장 시스템을 만들어 봅시다. 모든 유형의 content를 포장할 수 있는 generic Wrapper 클래스와, gift와 card 메시지를 pair하기 위한 두 개의 type parameter를 가진 GiftBox 클래스를 만듭니다.

코드를 두 개의 파일로 구성합니다:

  • wrapper.dart: 여기에서 generic 클래스를 Define합니다:
    • Wrapper<T> generic 클래스에는 T content Property와 Constructor가 있습니다. content를 returns하는 unwrap() Method와 Wrapped: [content]를 prints하는 describe() Method를 포함하세요.
    • GiftBox<G, C> generic 클래스에는 두 개의 Properties가 있습니다: G giftC 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()
}
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

객체 지향 프로그래밍의 모든 레슨

직접 연습해 보세요: 온라인 Dart 컴파일러