지네릭스란?
컴파일 시 타입을 체크해주는 기능.
지네릭스가 생기기 전에는 컴파일러가 컴파일 단계에서 형변환 에러를 잡지 못하고 런타임 에러가 발생했다.
그래서 컴파일 단계에서 에러가 발생하게 하기 위해 (=컴파일러를 도와주기 위해) 지네릭스가 생겼다.
ClassCastException(형변환 에러)이 발생하지 않도록 막아준다.
첫 번째 장점.
타입의 안정성 제공 -> 타입 체크를 정확하게 해 줌
ArrayList는 Object 타입으로 모든 객체를 반환한다. (즉, 다양한 객체를 담을 수 있다는 뜻)
하지만 보통 한 종류의 객체를 담는 경우가 많다. 그래서 아예 지네릭 타입으로 객체를 지정해준다.
지네릭 타입과 일치하지 않는 Audio()를 추가하려고 하면 컴파일 에러가 발생한다.
ArrayList<Tv> tvList = new ArrayList<Tv>();
tvList.add(new Tv()); // OK
tvList.add(new Audio()); // 컴파일 에러
두 번째 장점.
타입 체크와 형변환을 생략할 수 있으므로 코드가 간결해진다.
// 지네릭스를 적용하지 않은 코드
ArrayList tvList = new ArrayList();
tvList.add(new Tv());
Tv t = (Tv)tvList.get(0); // tvList.get(0)의 반환 타입이 Object이므로 Tv 타입으로 형변환
// 지네릭스를 적용한 코드
ArrayList<Tv> tvList = new ArrayList<Tv>();
tvList.add(new Tv());
Tv t = tvList.get(0); // 지네릭스가 적용되어 형변환없이 값을 꺼내올 수 있음
지네릭 타입과 다형성
참조 변수에 지정해준 지네릭 타입과 생성자에 지정해준 지네릭 타입이 꼭 일치해야 한다.
일치하기만 하면 클래스 타입 간의 형변환에도 문제없다.
ArrayList<Tv> list = new ArrayList<Tv>(); // OK
ArrayList<Product> list = new ArrayList<Tv>(); // 에러. 지네릭 타입 불일치
List<Tv> list = new ArrayList<Tv>(); // OK
'JAVA' 카테고리의 다른 글
static은 언제 붙일까? (0) | 2021.01.14 |
---|---|
Comparator / Comparable 인터페이스 (0) | 2021.01.12 |
Collection 클래스 정리 (0) | 2021.01.10 |
Collections (0) | 2021.01.10 |
HashMap (0) | 2021.01.08 |