제네릭 메서드
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]
}제네릭 메서드를 사용하면 메서드 수준에서 형식 안전성을 세밀하게 제어할 수 있으므로, 컴파일 시점의 형식 검사의 이점을 누리면서도 클래스를 더 간결하게 유지할 수 있습니다.
챌린지
쉬움제네릭 메서드의 강력함을 보여 주는 데이터 변환 유틸리티를 만들어 봅시다. 전체 클래스를 제네릭으로 만들지 않고도 어떤 타입이든 다룰 수 있는 메서드를 갖춘 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를 호출하세요
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
객체 지향 프로그래밍의 모든 레슨
직접 연습해 보세요: 온라인 Dart 컴파일러