🌱 오늘의 주제 : 제한된 지네릭 클래스 & 와일드 카드
🌱 제한된 지네릭 클래스
- 타입 매개변수 T에 지정할 수 있는 타입의 종류를 제한 하는 방법은 extends를 사용하면, 특정 타입의 자손들만 대입할 수 있게 제한 할 수 있다.
class FruitBox<T extends Fruit> { // Fruit의 자손만 타입으로 지정가능
ArrayList<T> list = new ArrayList<T>();
}
FruitBox<Apple> appleBox = new FruitBox<Apple>(); // OK
FruitBox<Toy> toyBox = new FruitBox<Toy>(); // 에러. Toy는 Fruit의 자손이 아님.
- 인터페이스를 구현해야 한다면, extends를 사용한다. (implements 사용하지 않음)
interface Eatable {}
class FruitBox<T extends Eatable> {...}
- 클래스 Fruit의 자손이면서 Eatable 인터페이스도 구현해야 한다면, 아래와 같이 & 로 연결한다.
class FruitBox<T extends Fruit & Eatable> {...}
🌱 제한된 지네릭 클래스 예제
package chapter12;
import java.util.ArrayList;
class Fruit implements Eatable {
public String toString() {
return "Fruit";
}
}
class Apple extends Fruit {
public String toString() {
return "Apple";
}
}
class Grape extends Fruit {
public String toString() {
return "Grape";
}
}
class Toy {
public String toString() {
return "Toy";
}
}
interface Eatable {
}
public class Ex12_3 {
public static void main(String[] args) {
// 제한된 지네릭 클래스 예제
FruitBox<Fruit> fruitBox = new FruitBox<Fruit>();
FruitBox<Apple> appleBox = new FruitBox<Apple>();
FruitBox<Grape> grapeBox = new FruitBox<Grape>();
// FruitBox<Grape> grapeBox = new FruitBox<Apple>(); // 에러. 타입 불일치
// FruitBox<Toy> toybox = new FruitBox<Toy>(); // 에러. 조상-자손 관계 아님.
fruitBox.add(new Fruit());
fruitBox.add(new Apple());
fruitBox.add(new Grape());
appleBox.add(new Apple());
// appleBox.add(new Grape()); 에러. Grape은 Apple의 자손 아님.
grapeBox.add(new Grape());
System.out.println("fruitBox-" + fruitBox);
System.out.println("appleBox-" + appleBox);
System.out.println("grapeBox-" + grapeBox);
} // main
}
class FruitBox<T extends Fruit & Eatable> extends Box<T> {
}
class Box<T> {
ArrayList<T> list = new ArrayList<T>();
void add(T item) {list.add(item);}
T get(int i) {
return list.get(i);
}
int size() {
return list.size();
}
public String toString() {
return list.toString();
}
}
----
fruitBox-[Fruit, Apple, Grape]
appleBox-[Apple]
grapeBox-[Grape]
🌱 와일드 카드
- 지네릭 타입에 다형성을 적용하는 방법은 와일드 카드를 사용하면 된다.
- 기호 ? 를 사용한다.
<? extedns T> 와일드 카드의 상한 제한. T와 그 자손들만 가능
<? super T> 와일드 카드의 하한 제한. T와 그 조상들만 가능
<?> 제한 없음. 모든 타입이 가능. <? extends Object> 와 동일
- 와일드 카드를 이용하면 하나의 참조변수로 다른 지네릭 타입이 지정된 객체를 다룰 수 있다.(tv와 audio가 product의 자손이라고 가정)
ArrayList<? extends Product> list = new ArrayList<Tv>(); // OK
ArrayList<? extends Product> list = new ArrayList<Audio>(); // OK
'Java' 카테고리의 다른 글
Java - 열거형(enum) (0) | 2023.03.09 |
---|---|
Java - 지네릭 메서드와 형변환 (2) | 2023.03.08 |
Java - 지네릭스(Generics) (0) | 2023.03.06 |
Java - Math클래스 (0) | 2023.03.02 |
Java - StringBuffer클래스 (0) | 2023.03.01 |