지네릭
업데이트:
지네릭 클래스
- extends 로 대입할 수 있는 타입을 제한
- 인터페이스인 경우에도 동일하게 사용함
class FruitBox<T extends Fruit>{
...
}
// 가능
FruitBox<Apple> appleBox = new FruitBox<Apple>();
// 에러
FruitBox<Apple> appleBox = new FruitBox<Toy>();
// 인터페이스도 같이 확인
class FruitBox<T extends Fruit & Etable>{
...
}
// 이런식으로 활용 가능
class FruitBox<T extends Fruit & Etable> extends Box<T>{}
class Box<T> {
ArrayList<T> list = new ArrayList<T>();
void add(T item) {list.add(teim); }
int size() {retunr list.size}
T get(int i) { return list.get(i)}
}
제약
- 타입 변수에 대입은 인스턴스 별로 다르게 가능하다.
- 대입된 타입은 같아야한다, 부조 자식 X
- static 멤버에 타입 변수 사용 할 수 없다.
- 모든 인스턴스에 공통이기 때문에 사용할 수 없다.
- 배열 생성할때 타입 변수 사용불가, 타입 변수로 배열 선언은 가능
- new 객체는 타입이 확정되어야 한다.
FruitBox<Apple> appleBox = new FruitBox<Apple>(); //ok
FruitBox<Grape> grapeBox = new FruitBox<Grape>(); //ok
FruitBox<Grape> grapeBox = new FruitBox<Apple>(); //에러
class Box<T>{
static T item; // 에러
T[] itemArr; //가능, T 타입의 배열을 위한 참조변수
static int compare(T t1, T t2){...} //에러
T[] toArrray(){
// 에러, 지네릭 배열 생성 불가능
T[] tempArr = new T[itemarr.length];
}
}
와일드 카드
- 하나의 참조 변수로 대입된 타입이 다른 객체를 참조 가능
- 메서드의 매개변수로 받는 경우 다형성을 가질 수 있다.
- 클래스 타입 매개변수
와 메서드의 타입 매개변수 는 별개다 - <? extends T> : 와일드 카드의 상한 제한, T와 그 자손들만 가능
- <? super T> : 와일드 카드의 히힌 제한, T와 그 조상들만 가능
- <?> : 제한 없음, 모든 타입 가능 <? extends Object> 와 동일
FruitBox<Fruit> grapeBox = new FruitBox<Grape>(); //에러
FruitBox<? super Fruit> grapeBox = new FruitBox<Apple>(); //에러
FruitBox<? extend Fruit> grapeBox = new FruitBox<Apple>(); //가능
FruitBox<?> grapeBox = new FruitBox<Apple>(); //가능
FruitBox<Fruit> grapeBox = new FruitBox<Fruit>(); //에러
grapeBox.add(new Apple); //매개변수의 와일드 카드에 따라 다름
FruitBox<? extend Fruit> grapeBox {
add (? extend Fruit fruitBox){
..
}
}
지네릭 메서드
- 메서드를 호출할 때마다 타입을 대입해야 한다.(대부분 생략 가능)
FruitBox<Fruit> grapeBox = new FruitBox<Fruit>();
FruitBox<Apple> grapeBox = new FruitBox<Apple>(); //에러
//<Fruit>,<Apple> 생략 가능
Juicer.<Fruit>makeJuice(fruitBox));
Juicer.<Apple>makeJuice(appleBox));
<Fruit>makeJuice(fruitBox)); //에러 클래스이름 생략 불가
static <T extends Fruit> Juice makeJuice(FruitBox<T> box) {
...
}
.. 이어서
댓글남기기