제네릭 메서드
Coddy Java 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 87개 중 55번째.
generic 클래스는 전체 클래스가 다양한 타입과 함께 작동하도록 하지만, 때로는 단일 메서드만 generic으로 만들면 됩니다. generic 메서드는 클래스 수준의 generic과는 독립적으로 자체 타입 매개변수를 선언합니다.
메서드 시그니처에서 타입 매개변수는 반환 타입 앞에 나타납니다:
public class Utility {
public static <T> void printArray(T[] array) {
for (T element : array) {
System.out.println(element);
}
}
}
String[] names = {"Alice", "Bob"};
Integer[] numbers = {1, 2, 3};
Utility.printArray(names); // String[]와 작동합니다
Utility.printArray(numbers); // Integer[]와 작동합니다수정자와 반환 형식 사이에 배치된 <T>에 주목하세요. 이는 T를 이 특정 메서드의 형식 매개변수로 선언합니다. 컴파일러는 전달하는 인수에서 실제 형식을 추론합니다.
generic method는 generic 타입도 반환할 수 있습니다:
public static <T> T getFirst(T[] array) {
if (array.length > 0) {
return array[0];
}
return null;
}
String first = getFirst(new String[]{"a", "b"}); // "a"를 반환합니다필요할 때 여러 타입 매개변수를 사용할 수 있습니다:
public static <K, V> void printPair(K key, V value) {
System.out.println(key + ": " + value);
}
printPair("Age", 25); // String과 Integer
printPair(1, "First"); // Integer와 String제네릭 메서드는 제네릭 클래스를 만들지 않고도 유연하고 재사용 가능한 연산이 필요한 유틸리티 클래스에서 특히 유용합니다.
챌린지
쉬움generic method의 유연성을 보여 주는 utility toolkit을 만들어 보겠습니다. 어떤 type에서도 작동하는 재사용 가능한 method를 포함하는 class를 만들면서, generic method가 generic class와 독립적으로 존재할 수 있다는 점을 보여 줍니다.
코드를 두 파일에 나누어 구성합니다.
ArrayUtils.java: array 작업을 위한 generic method를 포함하는 utility class를 만듭니다. class에는 다음 세 가지 static generic method가 있어야 합니다.getLast- typeT의 array를 받아 마지막 element를 반환하는 generic method입니다. array가 비어 있으면null을 반환합니다.swap- typeT의 array와 두 integer indices를 받아 해당 positions의 elements를 교환하는 generic method입니다. 이 method는 아무것도 반환하지 않습니다.printWithLabel- 두 type parameterK와V를 사용하는 generic method입니다. typeK의 label과 typeV의 값을 받아 다음 format으로 출력합니다:[label]: [value]Main.java: generic method를 실제로 사용해 봅니다! 네 개의 inputs를 받습니다. 두 개의 단어(String)와 두 개의 숫자(integer)입니다.먼저 두 단어를 containing하는
String[]array를 만듭니다.getLast를 사용하여 마지막 element를 가져오고 다음을 출력합니다:Last word: [result]그다음 두 숫자를 containing하는
Integer[]array를 만듭니다.swap을 Call하여 indices 0과 1의 elements를 교환한 다음 다음을 출력합니다:After swap: [first], [second]마지막으로
printWithLabel을 두 번 Call하여 두 parameter를 사용하는 generic method를 보여 줍니다.- first word를 label로, first number를 값으로 사용하여 한 번
- first number를 label로, second word를 값으로 사용하여 한 번
다음 순서로 네 개의 inputs를 받습니다: first word, second word, first number, second number.
각 method가 반환 type 앞에 <T> 또는 <K, V>를 사용하여 자체 type parameter(s)를 선언하는 방식을 살펴보세요. compiler는 전달하는 arguments에서 실제 types를 추론하므로, method를 Call할 때 명시적으로 지정할 필요가 없습니다!
직접 해보기
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// 입력 읽기
String firstWord = scanner.nextLine();
String secondWord = scanner.nextLine();
int firstNumber = scanner.nextInt();
int secondNumber = scanner.nextInt();
// TODO: 두 단어를 포함하는 String[] 배열 생성
// TODO: ArrayUtils.getLast를 사용하여 마지막 요소 가져오기
// 출력: "Last word: [result]"
// TODO: 두 숫자를 포함하는 Integer[] 배열 생성
// TODO: ArrayUtils.swap을 호출하여 인덱스 0과 1의 요소 교환
// 출력: "After swap: [first], [second]"
// TODO: firstWord를 레이블로, firstNumber를 값으로 하여 ArrayUtils.printWithLabel 호출
// TODO: firstNumber를 레이블로, secondWord를 값으로 하여 ArrayUtils.printWithLabel 호출
}
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
객체 지향 프로그래밍의 모든 레슨
4상속
상속의 기초 (extends)super 키워드메서드 오버라이딩 (@Override)생성자 체이닝Object 클래스단일 및 다중 레벨 상속다중 클래스 상속이 불가능한 이유요약 - 직원 계층 구조직접 연습해 보세요: 온라인 Java 컴파일러