제네릭 타입을 이용함으로써 잘못된 타입이 사용될 수 있는 문제를 컴파일 과정에서 제거할 수 있다.
제네릭은 클래스와 인터페이스, 메소드를 정의할 때 타입(type)을 파라미터(parameter)로 사용할 수 있도록 한다.
장점1. 컴파일 시 강한 타입 체크를 할 수 있다.
실행시 타입 에러가 나는 것보다 컴파일 시에 미리 타입을 강하게 체크해서 에러를 사전에 방지
장점2. 타입 변환(castring)을 제거한다.
비제네릭 코드는 불필요하게 타입 변환을 하기 때문에 프로그램 성능에 악영향을 미친다.
List list = new ArrayList();
list.add("hello");
String str = (String) list.get(0); // 타입 변환이 필요
List<String> list2 = new ArrayList<>();
list2.add("hello");
String str2 = list.get(0); // 불필요
제네릭 타입은 타입을 파라미터로 가지는 클래스와 인터페이스를 말한다.
클래스 또는 인터페이스 이름 뒤에 "<>"부호가 붙고, 사이에 타입 파라미터가 위치한다.
public class 클래스<T> { ... }
public interface 인터페이스<T> { ... }
타입파라미터는 일반적으로 대문자 알파벳 한 글자로 표현한다.
// 비제네릭 타입 이용시
public class Corn{
private Object obj;
public Object get();
public void set(Object obj);
}
// 제네릭 타입 이용시
public class Corn<T>{
private T t;
public T get();
public void set(T t);
}
Object 타입을 사용하면 모든 객체를 저장할 수 있는 장점이 있지만, 저장할 때 타입 변환이 발생하고, 읽어 올때에도 타입 변환이 발생한다.
public class Example{
// 비제네릭
Corn cron = new Corn();
corn.set("콘"); // String -> Object (자동 타입 변환)
String name = (String) corn.get(); // Object -> String (강제 타입 변환)
// 제네릭
Corn<String> corn = new Corn();
cron.set("콘");
String name = corn.get();
}