1. 제네릭 메소드 정의
2. 제네릭 메소드의 제한된 타입 매개변수 선언
클래스 전부가 아닌 메소드 하나에 대해서만 제네릭 선언을 하고 싶을 경우 제네릭 메소드를 선언할 수 있습니다.
class Box<T> {
private T ob;
public void set(T o) {
ob = o;
}
public T get() {
return ob;
}
}
class BoxFactory {
//제네릭 메소드
public static <T> Box<T> makeBox(T o) {
Box<T> box = new Box<T>();
box.set(o);
return box;
}
}
static 옆의 < T >는 제네릭 클래스에서 Box< T > 와 같다고 생각하면 이해하기 편합니다.
public static <T> Box<T> makeBox(T o)
//<T>를 지워보면 Box<T>를 반환하는 메소드라는걸 파악하기 쉽다.
public static Box<T> makeBox(T o)
제네릭 클래스와 제네릭 메소드의 타입 매개변수 T 결정 시점 차이
제네릭 클래스 - 인스턴스 생성 시점
Map<String,Integer> map = new HashMap<>();
제네릭 메소드 - 메소드 호출 시점
Box<String> sBox = BoxFactory.<String>makeBox("Sweet"); Box<Double> dBox = BoxFactory.<Double>makeBox(7.59); //오토박싱 진행
❗️ < String>, < Double>은 생략 가능
Box<String> sBox = BoxFactory.makeBox("Sweet"); Box<Double> dBox = BoxFactory.makeBox(7.59); //오토박싱 진행
제네릭 클래스에서 extends 키워드를 통해 타입 인자로 올 수 있는 클래스를 제한할 수 있습니다.
class BoxFactory {
public static <T extends Number> Box<T> makeBox(T o) {
Box<T> box = new Box<T>();
box.set(o);
return box;
}
public static <T extends Number> T openBox(Box<T> box){
box.get().intValue(); // 타입 매개변수를 제한하였기에 Number의 메소드 호출 가능
return box.get();
}
}