제네릭(Generics)이란 컴파일시 타입을 체크해주는 기능
컴파일때 타입체크를 해주긴 하지만 한계가 있었음
//제네릭으로 TV객체만 저장할수있는 ArrayList를 생성함
ArrayList<Tv> tvList = new ArrayList<Tv>();
//원래 ArrayList는 Object[]이라 모든 종류의 객체 저장가능해서 Tv외의 다른 타입 저장가능하지만
//제네릭으로 타입을 Tv로 지정해뒀으므로 다른타입은 에러가 난다.
tvList.add(new Tv()); //OK
tvList.add(new Audio()); //컴파일 에러, Tv 이외 다른 타입은 저장 불가
예를 들어 ArrayList를 만들어서 그 안에 숫자,문자를 같이 넣고 저장하면
public class GenericTest {
public static void main(String[] args) {
ArrayList list = new ArrayList();
list.add(10);
list.add(20);
list.add("30"); //String을 추가함
Integer i = (Integer)list.get(2);//컴파일 OK
System.out.println(list);//[10,20,30]
}
}
컴파일 에러는 안남(저장시 에러 안남)
근데 실행하면 ClassCastException (형변환)에러남
실행시 발생하는 에러는 프로그램이 죽기때문에 실행시 에러보다 컴파일 에러가 나은것임
컴파일에서 잡아내지 못하는 위와 같은 에러를 컴파일시에 잡기 위해 제네릭을 사용함
public class GenericTest {
public static void main(String[] args) {
ArrayList<Integer> list = new ArrayList<Integer>();
list.add(10);//list.add(new Integer(10));
list.add(20);
list.add("30"); //제네릭 덕분에 타입체크 강화됨, 컴파일 에러남
Integer i = (Integer)list.get(2);
System.out.println(list);
}
}
잘못된 타입인 String을 넣으니 컴파일 에러가 나게되어 실행전에 수정할수있게된다.
public class GenericTest {
public static void main(String[] args) {
ArrayList<Integer> list = new ArrayList<Integer>();
list.add(10);//list.add(new Integer(10));
list.add(20);
list.add(30);
// Integer i = (Integer)list.get(2);
Integer i = list.get(2);//당연히 Integer타입일거니까 형변환 생략 가능
System.out.println(list);
}
}
만약 Integer 말고 여러 타입의 객체를 저장하고싶다면,
ArrayList<Object> list = new ArrayList<Object>();
list.add(20);
list.add("30");
Integer i = (String)list.get(1);
위와같이 Object타입으로 넣으면 된다. 대신 형변환이 필요함
출처: 남궁성의 정석코딩 [자바의 정석 - 기초편] ch12-1 지네릭스란?