모든 객체에 대해 동일하게 동작해야하는 static 멤버에 타입 변수 T를 사용할 수 없다. 왜냐하면 T는 인스턴스 변수로 간주되기 때문이다.
즉 다음과 같은 코드는 에러가 발생한다.
✍️ 작성
class Box<T> {
static T item; // 에러 발생
static int compare(T t1, T t2) {...} // 에러 발생
}
해당 포스팅에서 알아보았듯 static 멤버는 인스턴스와는 독립적으로 클래스 자체에 속하므로 특정 인스턴스에 종속되지 않는다. 반대로 타입 매개변수(T)는 인스턴스화될 때 지정되므로, 클래스 로딩 시점에 정해진 static 멤버와는 개념적으로 맞지 않는다. static 멤버들은 클래스 자체에서 다뤄질 수 있어야 한다.

하지만 다음 그림과 같이 지네릭 메서드의 경우, static 메서드에서도 지네릭스 사용이 가능하다. 그 이유는 무엇일까?
바로 지네릭 메서드는 메서드 선언 시점에 타입 매개변수를 정의하고, 메서드 호출 시점에 구체적인 타입을 지정하기 때문이다. 이는 인스턴스와 관련이 없기 때문에, static 메서드에서도 제네릭 타입을 사용할 수 있다. 인스턴스를 생성하지 않고 곧바로 클래스 레벨에서 호출이 가능하기 때문에 지네릭스 사용이 가능한 것이다.
예제 코드는 다음과 같다.
✍️ 작성
class Juicer {
static <T extends Fruit> Juice makeJuice(FruitBox<T> box) {
String tmp = "";
for(Fruit f : box.getList()) tmp += f + " ";
return new Juice(tmp);
}
}
public class Ex1 {
public static void main(String[] args) {
FruitBox<Fruit> fruitBox = new FruitBox<Fruit>();
FruitBox<Apple> appleBox = new FruitBox<Apple>();
System.out.println(Juicer.<Fruit>makeJuice(fruitBox)); // 클래스 레벨에서 makeJuice 호출
System.out.println(Juicer.<Apple>makeJuice(appleBox)); // 클래스 레벨에서 makeJuice 호출
}
}
다음 코드와 같이 Juicer 클래스의 인스턴스 생성없이 makeJuice 메서드에서 지네릭 타입을 바로 대입하여 호출했다. 이와 같이 메서드에 선언된 지네릭 타입은 지역 변수를 선언한 것과 같다고 생각하면 된다.
자바의 정석 3판 (남궁성)
[Java] 제네릭 메소드(Generic Method)란?