먼저 아래와 같이 제네릭 클래스에서 제네릭 타입 파라미터를 사용하는 메서드를 제네릭 메서드라고 착각하기 쉬운데, 이것은 그냥 타입 파라미터로 타입을 지정한 메서드 일 뿐입니다.
class FruitBox<T> {
public T addBox(T x, T y) {
// ...
}
}
제네릭 메서드란, 메서드의 선언부에 <T> 가 선언된 메서드입니다.
위에서는 클래스의 제네릭<T> 에서 설정된 타입을 받아와 반환 타입으로 사용할 뿐인 일반 메서드라면, 제네릭 메서드는 직접 메서드에<T> 제네릭을 설정함으로서 동적으로 타입을 받아와 사용할 수 있는 독립적으로 운용 가능한 제네릭 메서드라고 이해하면 됩니다.
class FruitBox<T> {
// 클래스의 타입 파라미터를 받아와 사용하는 일반 메서드
public T addBox(T x, T y) {
// ...
}
// 독립적으로 타입 할당 운영되는 제네릭 메서드
public static <T> T addBoxStatic(T x, T y) {
// ...
}
}
즉, 제네릭 클래스에 정의된 타입 매개변수와 제네릭 메서드에 정의된 타입 매개변수는 별개인 게 되는 것이죠.
참고로 제네릭 메서드의 제네릭 타입 선언 위치는 메서드 반환 타입 바로 앞 입니다.
그럼 제네릭 메서드를 호출은 어떻게 할까?
제네릭 타입을 메서드명 옆에 지정해줬으니, 호출 역시메서드 왼쪽에 제네릭 타입이 위치하게 됩니다.
FruitBox.<Integer>addBoxStatic(1, 2);
FruitBox.<String>addBoxStatic("안녕", "잘가");