제네릭은 java5 부터 사용할 수 있음
컬렉션이 담을 수 있는 타입을 컴파일러에 미리 알려줄 수 있다.
그래서 컴파일러는 알아서 형변환 코드를 추가할 수 있게 되고, 엉뚱한 타입의 객체를 넣으려는 시도를 컴파일 과정에서 차단하여 더 안전하고 명확한 프로그램을 만들어 준다.
제네릭
Generic type은 타입을 파라미터로 가지는 클래스(class<T>)와 인터페이스(interface<T>)를 말한다.
이때, Raw type은 타입 파라미터가 없는 제네릭 타입을 의미한다.
raw 타입의 문제점
Raw type : runtime 오류
public class RawTypeTest {
static class Coin {
public void cancle(){
System.out.println("Coin.cancle");
}
}
static class Stamp {
public void cancle(){
System.out.println("Stamp.cancle");
}
}
public static void main(String[] args) {
// stamps는 Stamp 인스턴스만 취급
Collection stamps = new ArrayList();
// Stamp만 받고 싶지만, Coin이 들어가도 아무 오류 없이 컴파일되고 실행됨.
stamps.add(new Stamp());
stamps.add(new Coin());
// 조회시 ClassCastException 발생
for (Iterator i = stamps.iterator(); i.hasNext();) {
Stamp stamp = (Stamp) i.next();
stamp.cancle();
}
}
}
오류는 가장 빨리 발견하는 것이 좋으며, 즉 가능한 발생 즉시(컴파일) 발견하는 것이 좋음
위의 예제에서는 오류가 발생하고 한참뒤인 런타임에서야 오류를 발견할 수 있음
런타임시 ClassCastException 오류가 발생하게 되면, 해당 오류가 발생한 부분을 찾기 위해 전체 코드를 훑어봐야할 수도 있음
컴파일타임(Compile time)이란? : 개발자에 의해 C, JAVA 등과 같은 개발 언어로 소스코드가 작성되며, 컴파일 과정을 통해 컴퓨터가 인식할 수 있는 기계어 코드로 변환되어 실행 가능한 프로그램이 되는 과정을 의미
런타임(Run time)이란? : 컴파일 과정을 마친 응용 프로그램이 사용자에 의해서 실행되어지는 '때(time)'를 의미
런타임에러(Run time error)란? : 이미 컴파일이 완료되어 프로그램이 실행중임에도 불구하고, 의도치 않은 예외 상황으로 인하여 프로그램 실행 중에 발생하는 오류 형태를 의미