제네릭 메서드
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]
}제네릭 메서드는 메서드 수준에서 타입 안정성에 대한 세밀한 제어를 제공하여, 컴파일 타임 타입 체크의 이점을 누리면서도 클래스를 더 단순하게 유지할 수 있게 해줍니다.
챌린지
쉬움제네릭 메서드의 강력함을 보여주는 데이터 변환 유틸리티를 만들어 보겠습니다. 클래스 전체를 제네릭으로 만들지 않고도 유연성을 제공하는, 모든 타입과 함께 작동할 수 있는 메서드를 가진 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을 사용하여7이3번 반복되는 리스트를 생성하고 결과를 출력합니다.'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치트 시트
제네릭 메서드는 반환 타입 앞에 타입 매개변수를 선언하여, 클래스 전체를 제네릭으로 만들지 않고도 개별 메서드가 유연하게 작동할 수 있도록 합니다:
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를 사용하세요.
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.