java에서 컴파일 시 타입을 체크해 주는 기능이다.
제네릭 문법이 만들어진 이유
1. 컴파일 시 타입체크를 통해 시스템 안정성을 확보한다. 타입의 불일치로 발생하는 런타임 오류를 미연에 방지한다.
2. 불필요한 형변환을 제거하여 시스템의 성능을 향상시킨다.
public Tester {
public static void main(String[] args) {
//제네릭 사용하지 않은 경우
List list = new ArrayList();
list.set("hello"); //저장시 자동 형변환
String str = (String) list.get(0); //값 가져올 시 형변환
//제네릭 사용한 경우
List<String> list2 = new ArrayList<String>();
list2.set("hello");
String str2 = list2.get(0);
//형변환 없음 - 타입 변환이 필요 없어 프로그램의 성능이 향상됨
}
}
특정 클래스의 필드에 모든 종류의 자바 객체를 저장하고 싶은 경우에 유용하다.
class Box {
private Object object;
pulic Object get() { return oject; }
public void set(Object oject) { this.object = obejct; }
}
//제네릭 사용 시
class Box2<T> {
private T t;
public T get() { return t; }
public void set(T t) { this.t = t; }
}
class BoxExample {
public static void main(String[] args) {
Box box = new Box();
box.set("Mike");
String name = (String) box.get();
box.set(0);
int num = (int) box.get();
Box2<String> box2 = new Box2<String>();
box2.set("Mike");
String name2 = box2.get();
Box2<Integer> box3 = new Box2<Integer>();
box3.set(0);
int value = box3.get();
}
}
제네릭 문법 간결화 하기
ArrayList<String> list = new ArrayList<String>();
// 제네릭 타입의 변수 선언과 객체 생성을 동시에 하는 경우 타입 파라미터 자리에 구체적인 타입을 명시하는 문법이 2번 나와 코드가 지저분해질 수 있음
자바 7부터 제네릭 타입 파라미터의 중복 기술을 줄이기 위해 다이아몬드 연산자 제공 <>
//java 7 이후
ArrayList<String> list = new ArrayList<>();
--> 컴파일러가 타입 파라미터 부분에 <> 연산자 사용하면 타입 파라미터를 유추해서 자동으로 설정해줌