- 클래스 내부 멤버변수에서 사용할 데이터 타입을 외부에서 지정하는 기법이다.
- 제네릭의 타입 인자로 기본형(int, double)은 사용할 수 없다.
- 제네릭은 extends 키워드를 붙여서 타입 매개변수를 제한하고 원하는 타입과 하위 타입들만 받도록 설정할 수 있다.
- 제네릭 메서드를 정의할 때는 메서드의 반환 타입 왼쪽에 <T>와 같이 타입 매개변수를 적어준다.
- 명확한 반환 타입이 필요할때는 제네릭 메서드 반환 타입이 없을때는 와일드카드를 사용하는게 좋다.
클래스 수준의 제네릭 타입 파라미터를 사용하는 메서드 vs 메서드 수준의 제네릭 타입 파라미터를 사용하는 제네릭 메서드
package genericTest;
public class Main2 {
public static void main(String[] args) {
GenericBox2<Integer> genericBox2 = new GenericBox2<>();
// 클래스 수준의 제네릭 타입 파라미터를 사용하는 메서드
genericBox2.genericTypeMethod(123); // value = 123
//genericBox2.genericTypeMethod("123"); // !! 에러발생 !! GenericBox2객체에 Integer를 할당했기 때문에
// 메서드 수준의 제네릭 타입 파라미터를 사용하는 제네릭 메서드
genericBox2.genericMethod2("kim"); // value = kim
genericBox2.genericMethod2(123); // value = 123
genericBox2.genericMethod2(true); // value = true
}
}
package genericTest;
public class GenericBox2 <T>{
public T genericTypeMethod (T value) {
System.out.println("value = " + value);
return value;
}
public <Z> Z genericMethod2 (Z value) {
System.out.println("value = " + value);
return value;
}
}
제네릭 클래스 타입 제한 사용법
public class Generic<T extends parent> {
}
제네릭 메서드 사용법
public <T> T instanceMethod1 (T value) {
System.out.println("value = " + value);
return value;
}
public <S extends Number> S instanceMethod2 (S value) {
System.out.println("value = " + value);
return value;
}
static <T> T genericStaticMethod1 (T value) {
System.out.println("value = " + value);
return value;
}
와일드카드를 사용한 메서드
public void wildCard (Box<?> value) {
System.out.println("value.getValue() = " + value.getValue());
}
public void wildCard2 (Box<? extends Animal> value) {
System.out.println("value.getValue() = " + value.getValue());
}