• 모든 종류의 데이터 타입을 다룰 수 있도록 함
• 일반화된 타입 매개 변수로 클래스 또는 메소드를 작성하는 기법
• 컴파일 시에 타입이 결정
-> 프로그램 작성을 안전하게 할 수 있다.
• 런타입 타입 충돌을 방지할 수 있다.
• ClassCastException 방지
• < E >, < K > , < V > 등 요소 타입을 일반화한 타입
• 타입 매개 변수는 나중에 실제 타입으로 구체화하여야 한다.
• < 과 > 사이에 하나의 대문자를 타입 매개 변수로 사용
• E : element를 의미
• T : Type를 의미
• V : Value를 의미
• K : Key를 의미
• 어떤 문자든지 타입 매개 변수로 사용 가능하다.
• 타입 매개 변수 타입의 객체를 생성 할 수 없다.
V value = new V(); // 오류!
• 클래스나 인터페이스 선언부에 일반화된 타입 추가
// 제네릭 클래스 선언
// 타입 매개 변수 T
public class GenericExClass<T> {
T value;
void set(T t) {
value = t;
} // T 타입의 값 t를 value로 대입하는 메소드
T get() {
return value;
} // T 타입의 값 value를 리턴하는 메소드
|
• 제네릭으로 작성된 클래스에 구체적인 타입을 대입하여 객체를 생성
• 컴파일러에 의해 수행된다.
// 제네릭으로 클래스 작성
public class GenericExClass<T> {
T value;
void set(T t) {
value = t;
}
T get() {
return value;
}
}
// 제네릭 객체 생성 - 구체화
GenericExClass<String> stringGeneric = new GenericExClass<String>();
// 타입 매개 변수에 String을 지정하여 구체화
stringGeneric.set("Java");
System.out.println(stringGeneric.get()); // "Java"를 출력
// 타입 매개 변수에 기본 타입은 사용할 수 없다.
GenericExClass<int> priType = new GenericExClass<int>();
// 컴파일 오류 발생!
• 제네릭 클래스와 인터페이스의 배열을 허용하지 않는다.
GenericExClass<String>[] gec = new GenericExClass<String>[5];
// 허용 x
• 매개 뱐수 타입(제네릭 타입) 배열을 허용하지 않는다.
T[] t = new T[5];
// 허용 x
• 타입 매개 변수의 배열에 레퍼런스는 허용한다.
public void printArray(T[] t) {
....
}
• 제네릭 메소드를 호출할 때는 타입을 명시하지 않아도 된다.
-> 컴파일러가 메소드의 인자로 이미 타입을 알고 있기 때문!
// 제네릭 메소드 선언
class GenericMethodEx {
static <T> void printArray(T[] t) {
for(int i=0; i<t.length; i++) {
System.out.println(t[i]);
}
}
}