지네릭

업데이트:

지네릭 클래스

  • 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) {
...
}

.. 이어서

태그:

카테고리:

업데이트:

댓글남기기