제네릭스 (지네릭스)Generics
1. JDK 1.5 도입~
(JDK 1.8 도입된 람다식 만큼 큰 변화)
2. 제(지)네릭스 ?
다양한 타입의 객체를 다루는 메서드, 컬렉션 클래스에
[컴파일 시에 타입체크]를 해주는 기능
3. 사용이유 ?
ㄱ. 객체의 타입 안정성을 높인다
- 의도하지 않은 타입의 객체가 저장되는 것을 막는다.
- 형변환할 때 오류 발생하는 것을 사전에 막아준다.
ㄴ. 형 변환의 번거로움 줄인다.
- 기호의 종류만 다를 뿐 '임의의 참조형 타입' 을 의미
* 제네릭 클래스 객체생성, 사용 , 제한
Bos<apple> appleBox = new Bos<apple>(); //성공
Bos<apple> appleBox = new Bos<banana>(); //에러
- Banana Fruit 자손이라 가정
Bos<Fruit> appleBox = new Bos<Fruit>(); //에러 , 대입된 다른 타입
- 클래스 타입이 상속관계가 있고 대입된 타입이 같은것이다.
Super_Fruit 가 Bos 의 자손이라 가정
Bos<Fruit>appleBox = new Super_Fruit<Banana>(); // 성공 , 다형성
- 제네릭 타입에 'extends'를 사용할 때, 특정 타입의 자손들만 대입할 수 있다.
Class Box<T extends loapin>{ // 오류 , loapin의 자손만 타입으로 지정가능
ArrayList<T> list = new ArrayList<T>();
....
}
- 하나의 종류 타입만 담을 수 있다.
Super_Fruit <Banana>appleBox = new Super_Fruit<Banana>(); //성공
Super_Fruit <loapin>TaeJa = new Super_Fruit<loapin>(); //에러 , ㅆ
와일드카드
- 제네릭 타입이 다른 것만으로는 오버로딩이 성립되지 않는다.
- 제네릭 타입은 컴파일러가 컴파일할 때만 사용하고 제거
- <? extends T & E > - 와일드 카드에는 & 를 사용할 수 없다 .
- <? extends Object> 로 하면 모든종류의 매개변수를 사용할 수 있다.
- 내부 크래스에 선언된 타입 문자가 외부 크래스의 타입 문자와 같아도 구별이 될 수 있다.
제네릭 타입의 제거
- 컴파일러는 제네릭 타입을 이용해서 소스파일을 체크하고, 필요한 곳에 형변환을 넣어주고 그다음 제네릭 타입을 제거
- 제네릭 타입의 bound(경계)를 제거한다.
ex) <T extends Box> -> T는 Box로 치환 ,
<T> -> T는 Object로 치환
- 제네릭 타입을 제거한 후에 타입이 일치하지 X 면 , 형변환 추가
// List의 get()은 Object타입을 반환하므로 형변환이 필요