Menu
Coddy logo textTech

제네릭 메서드

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);    // hello
}

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를 사용하고 결과를 출력합니다.
    • repeat을 사용하여 'Hi'4번 반복되는 리스트를 생성하고 결과를 출력합니다.
    • repeat을 사용하여 73번 반복되는 리스트를 생성하고 결과를 출력합니다.
    • 'Name'42를 사용하여 printPair를 호출합니다.
    • 100true를 사용하여 printPair를 호출합니다.

각 메서드가 자체 타입 매개변수를 선언하여 동일한 Transformer 객체가 정수, 문자열, 실수, 불리언과 함께 완벽한 타입 안전성을 유지하며 작동하는 방식에 주목하세요. printPair 메서드는 단일 메서드에서 두 개의 타입 매개변수를 사용하는 것을 보여줍니다.

예상 출력:

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

치트 시트

제네릭 메서드는 반환 타입 앞에 타입 매개변수를 선언하여, 클래스 전체를 제네릭으로 만들지 않고도 개별 메서드가 유연하게 작동할 수 있도록 합니다:

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

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 printPair<A, B>(A first, B second) {
  print('Pair: $first and $second');
}

직접 해보기

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실력 점검

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

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