Menu
CoddyTech

제네릭 메서드

Coddy Dart 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 110개 중 66번째.

클래스가 제네릭일 수 있는 것처럼 개별 메서드도 자체 타입 매개변수를 가질 수 있습니다. 이는 클래스 전체를 제네릭으로 만들지 않고도 유연한 메서드가 필요할 때 유용합니다.

제네릭 메서드는 반환 타입 앞에 타입 매개변수를 선언합니다.

T findFirst<T>(List<T> items) {
  return items.first;
}

void main() {
  var firstNumber = findFirst<int>([1, 2, 3]);
  var firstWord = findFirst<String>(['hello', 'world']);
  
  print(firstNumber);  // 1
  print(firstWord);    // 안녕하세요
}

Dart는 인수에서 타입을 추론할 수 있는 경우가 많으므로, 항상 타입을 명시적으로 지정할 필요는 없습니다:

var result = findFirst([10, 20, 30]);  // Dart가 int로 추론함

일부 연산에만 타입 유연성이 필요한 경우, 제네릭 메서드는 클래스 내부에서 특히 유용합니다.

class Printer {
  void printItem<T>(T item) {
    print('Printing: $item');
  }
  
  List<T> duplicate<T>(T item, int count) {
    return List.filled(count, item);
  }
}

void main() {
  var printer = Printer();
  printer.printItem<String>('Hello');
  printer.printItem(42);  // 타입이 int로 추론됨
  
  var copies = printer.duplicate('Hi', 3);
  print(copies);  // [Hi, Hi, Hi]
}

제네릭 메서드를 사용하면 메서드 수준에서 형식 안전성을 세밀하게 제어할 수 있으므로, 컴파일 시점의 형식 검사의 이점을 누리면서도 클래스를 더 간결하게 유지할 수 있습니다.

challenge icon

챌린지

쉬움

제네릭 메서드의 강력함을 보여 주는 데이터 변환 유틸리티를 만들어 봅시다. 전체 클래스를 제네릭으로 만들지 않고도 어떤 타입이든 다룰 수 있는 메서드를 갖춘 Transformer 클래스를 만들겠습니다.

코드를 두 개의 파일로 나누겠습니다.

  • transformer.dart: 다음 제네릭 메서드를 갖춘 Transformer 클래스를 만듭니다.
    • T getFirst<T>(List<T> items) - 목록에서 첫 번째 요소를 반환합니다.
    • T getLast<T>(List<T> items) - 목록에서 마지막 요소를 반환합니다.
    • List<T> repeat<T>(T item, int times) - 지정한 횟수만큼 항목을 반복해서 담은 목록을 만듭니다.
    • void printPair<A, B>(A first, B second) - Pair: [first] and [second] 형식으로 두 값을 출력합니다.
  • main.dart: transformer 파일을 가져오고, 여러 타입을 사용해 각 제네릭 메서드를 보여 줍니다.
    • Transformer 인스턴스를 만듭니다.
    • [10, 20, 30]에 getFirst를 사용하고 결과를 출력합니다.
    • ['apple', 'banana', 'cherry']에 getFirst를 사용하고 결과를 출력합니다.
    • [1.5, 2.5, 3.5]에 getLast를 사용하고 결과를 출력합니다.
    • 'Hi'를 4번 반복하는 목록을 만들 때 repeat를 사용하고 결과를 출력합니다.
    • 7을 3번 반복하는 목록을 만들 때 repeat를 사용하고 결과를 출력합니다.
    • 'Name'과 42를 사용해 printPair를 호출합니다.
    • 100과 true를 사용해 printPair를 호출합니다.

각 메서드가 자체 타입 매개변수를 선언하므로, 동일한 Transformer 객체로 정수, 문자열, 실수, 불리언을 모두 완전한 타입 안전성을 유지하며 다룰 수 있다는 점에 주목하세요. printPair 메서드는 하나의 메서드에서 타입 매개변수 두 개를 사용하는 방법을 보여 줍니다.

예상 출력:

10
apple
3.5
[Hi, Hi, Hi, Hi]
[7, 7, 7]
Pair: Name and 42
Pair: 100 and true

직접 해보기

import 'transformer.dart';

void main() {
  // Transformer 인스턴스를 생성하세요
  var transformer = Transformer();

  // TODO: [10, 20, 30]에 getFirst를 사용하고 결과를 출력하세요

  // TODO: ['apple', 'banana', 'cherry']에 getFirst를 사용하고 결과를 출력하세요

  // TODO: [1.5, 2.5, 3.5]에 getLast를 사용하고 결과를 출력하세요

  // TODO: repeat를 사용해 'Hi'가 4번 반복된 리스트를 만들고 출력하세요

  // TODO: repeat를 사용해 7이 3번 반복된 리스트를 만들고 출력하세요

  // TODO: 'Name'과 42를 사용해 printPair를 호출하세요

  // TODO: 100과 true를 사용해 printPair를 호출하세요
}
quiz icon실력 점검

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

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

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