CH12-1 지네릭스란?
지네릭스(Generics)란? **컴파일타임때 타입을 체크(**Compile-time type check)해주는 기능이다!
이 기능이 언제필요할까?
예를 들면… ArrayList같은 컬렉션들은 모든 타입의 객체(Object obj)를 인자로 받을 수 있다.
때로는 이 인자의 타입에 제한을 두고 싶다. 이때 사용하는게 지네릭스임.
이렇게 ArrayList생성시 지네릭스에 Tv를 넣어주면… 컴파일타임때 이외의 타입이 들어가는걸 막아준다.
예제를 보자.
import java.util.ArrayList;
public class GenericText {
public static void main(String[] args) {
ArrayList list = new ArrayList();
list.add(10);
list.add(20);
list.add("30");
Integer i = (Integer)list.get(2); //실행시 에러 (ClassCastException)
System.out.println(i);
}
}
위의 코드를 실행시키면… 컴파일타임때는 문제없이 컴파일되지만, 문제의 줄을 실행하는 순간 에러가 난다. list[2]
는 String
인데, 이걸 강제로 (Integer)
로 형변환하고있기 때문이다.
실행 에러는 컴파일에러보다 치명적이다. 컴파일에러는 애초에 실행이 안되므로 문제를 잡을 수 있지만.. 실행 에러는 잘 실행되는 것 처럼 보이던 프로그램이 갑자기 종료되어버릴 수 있기 때문
위처럼 컴파일타임때 잡아주지 못하는 에러를 어떻게 해결할지에 대한 대답이 지네릭스다. 지네릭 문법은 실행에러를 컴파일에러로 끌고오기위한 고민의 결과이다.
ArrayList<Integer> list = new ArrayList<Integer>();
이렇게 실행하면… integer 만 저장할 수 있는 컬렉션이 만들어진다. (보니까 원시타입은 안되고, 래퍼타입을 넣어줘야 한다.)
위처럼 선언하고 나면 다른 타입을 list에 넣으려고 할때 컴파일 오류가 난다.
import java.util.ArrayList;
public class GenericText {
public static void main(String[] args) {
ArrayList<Integer> list = new ArrayList<Integer>()
list.add(10);
list.add(20);
list.add("30"); //컴파일 오류
}
}