
데이터의 타입을 클래스 내부에서 지정하는 것이 아닌 외부에서 사용자에 의해 지정되는 것
구체적인 타입을 명시하지 않고 타입 파라미터로 넣어두었다가, 실제 설계한 클래스가 사용되어질 때 구체적인 타입을 지정하여 사용
class ExClassGeneric<T> {
private T t;
public void setT(T t){
this.t = t;
}
public T getT() {
return t;
}
}
제네릭 타입의 객체는 생성 불가
static 멤버에는 제네릭 불가
제네릭 클래스 자체가 배열은 불가, 그런데 제네릭 타입의 배열 선언은 가능
class Sample<T> {
}
public class Main {
public static void main(String[] args) {
// 불가능
Sample<Integer>[] arr1 = new Sample<>[10];
// new Sample<Integer>() 인스턴스만 저장하는 배열을 나타냄
Sample<Integer>[] arr2 = new Sample[10];
// 제네릭 타입을 생략해도 위에서 이미 정의했기 때문에 Integer 가 자동으로 추론됨
arr2[0] = new Sample<Integer>();
arr2[1] = new Sample<>();
// Integer가 아닌 타입은 저장 불가능
arr2[2] = new Sample<String>();
}
}
| 타입 | 설명 |
|---|---|
| < T > | 타입(Type) |
| < E > | 요소(Element), 예를 들어 List |
| < K > | 키(Key), 예를 들어 Map<k, v> |
| < V > | 리턴 값 또는 매핑된 값(Variable) |
| < N > | 숫자(Number) |
| < S,U,V > | 2번째, 3번째, 4번째에 선언된 타입 |
제네릭 간의 형변환을 성립되게 하기 위해 와일드 카드 ?문법을 이용함
제네릭타입<?> : 타입 파라미터를 대치하는 것으로 모든 클래스나 인터페이스타입이 올 수 있음제네릭타입<? extends 상위타입> : 와일드카드의 범위를 특정 객체의 하위 클래스만 올 수 있음제네릭타입<? super 하위타입> : 와일드카드의 범위를 특정 객체의 상위 클래스만 올 수 있음