제네릭이란, 하나의 값으로 여러가지 다른 데이터 타입들을 가질수 있도록 하는 방법이다.
List list = new ArrayList();
list.add("hello");
String str = (String)list.get(0); // 타입 변환함
List<String> list = new ArrayList<String>();
list.add("hello");
String str = list.get(0); // 타입 변환 하지 않음
제네릭 타입(class , interface )
제네릭 타입은 타입을 파라미터로 가지는 클래스와 인터페이스를 말함
클래스, 인터페이스 이름 뒤에 <> 부호가 붙고, 사이에 타입 파라미터가 위치함
public class 클래스명<T> {...}
public interface 인터페이스명<T> {...}
// 비제네릭
public class ObjectType {
private Object object;
public Object getObject() {
return object;
}
public void setObject(Object object) {
this.object = object;
}
}
// 제네릭
public class GenericType<T> {
private T genericType;
public T getGenericType() {
return genericType;
}
public void setGenericType(T genericType) {
this.genericType = genericType;
}
}
public class GenericExample {
public static void main(String[] args) {
//비제네릭
ObjectType ot = new ObjectType();
ot.setObject("비제네릭타입");
// String -> Object (자동 타입 변환)
String str0 = (String)ot.getObject();
// Object -> String (강제 타입 변환)
//제네릭
GenericType<String> gt = new GenericType<String>();
gt.setGenericType("제네릭타입");
String str1 = gt.getGenericType();
}
}
Object 타입을 사용하면 모든 객체를 저장할 수 있는 장점이 있지만, 저장할 때 타입 변환이 발생하고, 읽어 올 때에도 타입 변환이 발생한다. 이런 타입 변환이 빈번하게 발생하면 프로그램 전체 성능에 좋지 못한 결과를 초래할 수 있다.
하지만 제네릭(Generic)은 클래스를 설계할 때 구체적인 타입을 명시하지 않고, 타입 파라미터로 대체했다가 실제 클래스가 사용될 때 구체적 타입을 지정함으로서 타입 변환을 최소화시키는 것을 확인할 수 있다.