데이터의 타입을 클래스 내부에서 지정하는 것이 아닌 외부에서 사용자에 의해 지정되는 것을 의미합니다.
JDK 1.5 이전에서는 여러 타입을 사용하는 대부분의 클래스나 메서드에서 인수나 반환 값으로 Object 타입을 사용했다.
위와 같은 코드는 런 타임 에러를 발생시킨다. List에 String을 저장해놓고 Integer로 타입 변환하는 오류가 런타임에 잡히는 것이다.
하지만 위와 같이 제네릭을 이용하면 컴파일 에러를 발생시켜 컴파일 시에 오류를 잡아낼 수 있다. 런 타임 에러보다 컴파일 에러가 훨씬 디버깅이 쉽기 때문에 이점이 많다.
또한, Object 객체를 이용하면 다시 원하는 타입으로 타입 변환을 해야 하기 때문에 이에 따른 성능 저하, 오류 발생 가능성 등이 존재한다. 따라서 제네릭을 사용하면 컴파일 시에 타입이 정해 지므로, 타입 검사나 타입 변환과 같은 작업을 생략할 수 있게 된다.