Menu
CoddyTech

제네릭 메서드

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

제네릭 클래스는 클래스 전체가 서로 다른 타입과 함께 작동하도록 하지만, 때로는 메서드 하나만 제네릭으로 만들면 됩니다. 제네릭 메서드는 클래스 수준의 제네릭과는 별개로 자체 타입 매개변수를 선언합니다.

메서드 시그니처에서 타입 매개변수는 반환 타입 앞에 옵니다:

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를 이 메서드에만 적용되는 타입 매개변수로 선언합니다. 컴파일러는 전달한 인수에서 실제 타입을 추론합니다.

제네릭 메서드는 제네릭 타입을 반환할 수도 있습니다.

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

제네릭 메서드는 제네릭 클래스를 만들지 않고도 유연하고 재사용 가능한 작업이 필요한 유틸리티 클래스에서 특히 유용합니다.

challenge icon

챌린지

쉬움

제네릭 메서드의 유연성을 보여 주는 유틸리티 도구 모음을 만들어 봅시다. 어떤 타입과도 함께 사용할 수 있는 재사용 가능한 메서드가 포함된 클래스를 만들고, 제네릭 메서드가 제네릭 클래스와 독립적으로 존재할 수 있음을 살펴봅니다.

코드를 두 개의 파일로 나눕니다.

  • ArrayUtils.java: 배열을 다루는 제네릭 메서드가 포함된 유틸리티 클래스를 만듭니다. 클래스에는 다음 세 가지 정적 제네릭 메서드가 있어야 합니다.

    getLast - T 타입의 배열을 받아 마지막 요소를 반환하는 제네릭 메서드입니다. 배열이 비어 있으면 null을 반환합니다.

    swap - T 타입의 배열과 정수 인덱스 두 개를 받아 해당 위치의 요소를 서로 바꾸는 제네릭 메서드입니다. 이 메서드는 아무것도 반환하지 않습니다.

    printWithLabel - K와 V 두 개의 타입 매개변수를 사용하는 제네릭 메서드입니다. K 타입의 레이블과 V 타입의 값을 받아 다음 형식으로 출력합니다: [label]: [value]

  • Main.java: 제네릭 메서드를 사용해 봅시다! 단어 두 개(String)와 숫자 두 개(정수), 총 네 개의 입력을 받습니다.

    먼저 두 단어가 모두 포함된 String[] 배열을 만듭니다. getLast를 사용해 마지막 요소를 가져와서 다음을 출력합니다: Last word: [result]

    다음으로 두 숫자가 모두 포함된 Integer[] 배열을 만듭니다. swap을 호출해 인덱스 0과 1에 있는 요소를 서로 바꾼 다음, 다음을 출력합니다: After swap: [first], [second]

    마지막으로 두 개의 타입 매개변수를 사용하는 제네릭 메서드인 printWithLabel을 두 번 호출해 봅니다.

    • 첫 번째 단어를 레이블로, 첫 번째 숫자를 값으로 사용해 한 번 호출합니다.
    • 첫 번째 숫자를 레이블로, 두 번째 단어를 값으로 사용해 한 번 호출합니다.

입력은 첫 번째 단어, 두 번째 단어, 첫 번째 숫자, 두 번째 숫자 순서로 네 개를 받습니다.

각 메서드가 반환 타입 앞에 <T> 또는 <K, V>를 사용해 자체 타입 매개변수를 선언하는 것에 주목하세요. 컴파일러는 전달한 인수에서 실제 타입을 추론하므로 메서드를 호출할 때 타입을 명시할 필요가 없습니다!

직접 해보기

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 호출하기
    }
}
quiz icon실력 점검

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

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

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