<T>
해당 타입 외에 X<Object>
로 하면 모든 게 다 들어갈 수 있다.이젠 <>
해야한다!!
장점 : 객체의 타입 안정성을 높이고 형변환의 번거로움을 줄여서 코드가 간결해진다.
ClassCastException : RuntimeException 의 자손
지네릭스는 RuntimeException(프로그래머 실수로 실행 중 발생하는 에러) 전에 컴파일 때 에러날 수 있게(compile time에러) 해준다.
✔런타임에러를 컴파일 타임에 체크할 수 있게 해준다.
✔컴파일러에게 타입정보를 줘서 형변환 에러를 줄인다.
지네릭 클래스를 작성할 때 Object타입 대신 타입변수(E)를 선언해서 사용한다.
일반 클래스 -> 지네릭 클래스
: ArrayList
-> ArrayList<E>
보통 <T>
, <E>
ArrayList<Tv> tvList = new ArrayList<Tv>();
✨✨타입변수 대신 실제타입이 지정되면 형변환 생략가능!!!
예전)
ArrayList tvList = new ArrayList();
tvList.add(new Tv());
Tv t = (Tv)tvList.get(0);
//형변환 필수!!! 왜?? 반환타입이 Object니까!!
ArrayList<Tv> tvList = new ArrayList<Tv>();
tvList.add(new Tv());
Tv t = tvList.get(0);
//형변환 불필요!! 왜?? 반환타입이 Tv니까!!!
Box<T>
(O)
ArrayList<Tv> list = new ArrayList<Tv>(); //타입 일치
..
(X)
ArrayList<Product> list = new ArrayList<Tv>(); //타입 불일치
List<Tv> list = new ArrayList<Tv>();
List<Tv> list = new LinkedList<Tv>();
ArrayList<Product> list = new ArrayList<Product>();
list.add(new Product());
list.add(new Tv()); //Product의 자손 OK
list.add(new Audio()); //Product의 자손 OK
위의 예에서
Product p = list.get(0); //get()의 반환타입 == Product
<Product>
, get()의 반환타입 == Product
이므로 형변환이 필요없다.
Tv t = (Tv)list.get(1); //get()의 반환타입 == Product
list[1]
에 Tv
가 들어가 있더라도 ✨✨원래 반환타입은 <Product>
이므로 형변환 필수!!