Menu
Coddy logo textTech

제네릭 메서드

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: 배열 작업을 위한 제네릭 메서드를 포함하는 유틸리티 클래스를 생성합니다. 클래스에는 세 가지 정적(static) 제네릭 메서드가 있어야 합니다:

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

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

    printWithLabel - 두 개의 타입 매개변수 KV를 가진 제네릭 메서드입니다. K 타입의 라벨과 V 타입의 값을 받아 [label]: [value] 형식으로 출력합니다.

  • Main.java: 작성한 제네릭 메서드들을 실제로 사용해 봅니다! 두 개의 단어(String)와 두 개의 숫자(Integer) 등 총 네 개의 입력을 받습니다.

    먼저, 두 단어를 포함하는 String[] 배열을 생성합니다. getLast를 사용하여 마지막 요소를 가져와 Last word: [result] 형식으로 출력합니다.

    다음으로, 두 숫자를 포함하는 Integer[] 배열을 생성합니다. swap을 호출하여 인덱스 0과 1의 요소를 바꾼 후, After swap: [first], [second] 형식으로 출력합니다.

    마지막으로, printWithLabel을 두 번 호출하여 두 개의 매개변수를 가진 제네릭 메서드를 시연합니다:

    • 첫 번째 단어를 라벨로, 첫 번째 숫자를 값으로 하여 한 번 호출
    • 첫 번째 숫자를 라벨로, 두 번째 단어를 값으로 하여 한 번 호출

입력은 첫 번째 단어, 두 번째 단어, 첫 번째 숫자, 두 번째 숫자의 순서로 주어집니다.

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

치트 시트

제네릭 메서드(generic method)는 클래스 레벨의 제네릭과는 독립적으로 자체 타입 매개변수를 선언합니다. 타입 매개변수는 메서드 시그니처에서 반환 타입 앞에 나타납니다.

기본적인 제네릭 메서드 구문:

public static <T> void printArray(T[] array) {
    for (T element : array) {
        System.out.println(element);
    }
}

<T>는 제어자와 반환 타입 사이에 위치합니다. 컴파일러는 사용자가 전달하는 인수를 통해 실제 타입을 추론합니다.

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

public static <T> T getFirst(T[] array) {
    if (array.length > 0) {
        return array[0];
    }
    return null;
}

여러 개의 타입 매개변수를 사용할 수 있습니다:

public static <K, V> void printPair(K key, V value) {
    System.out.println(key + ": " + value);
}

printPair("Age", 25);        // String and Integer
printPair(1, "First");       // Integer and String

제네릭 메서드는 제네릭 클래스를 생성하지 않고도 유연하고 재사용 가능한 작업을 수행하기 위해 유틸리티 클래스에서 유용하게 사용됩니다.

직접 해보기

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

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

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