충분히 쌓여가는
제한된 지네릭 클래스, 지네릭스의 제약 본문
제한된 지네릭 클래스
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 사용
interface Eatable {}
class FruitBox<T extends Eatable> { ...}
코드
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 {}
class GenericTest {
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 FruitBox<T extends Fruit> extends Box<T> {} // & Eatable 생략(Fruit가 Eatable 인터페이스를 구현했기 때문)
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]
지네릭스의 제약
타입 변수에 대입은 인스턴스 별로 다르게 가능
Box<Apple> appleBox = new Box<Apple>(); // OK, Apple 객체만 저장가능
Box<Grape> grapeBox = new Box<Grape>(); // OK, Grape 객체만 저장가능
1. static 멤버에 타입 변수 사용불가
class Box<T> {
static T item; // 에러
static int compare(T t1, T t2) { ...} // 에러
...
2. 배열 생성할 때 타입 변수 사용불가, 타입 변수로 배열 선언은 가능
new 연산자 다음 T 사용불가
class Box<T> {
T[] itemArr; // OK, T타입의 배열을 위한 참조변수
...
T[] toArray() {
T[] tmpArr = new T[itemArr.length]; // 에러, 지네릭 배열 생성불가
...
'Java > JAVA3' 카테고리의 다른 글
지네릭 메서드 (0) | 2023.07.28 |
---|---|
와일드 카드 <?>, 지네릭 메서드 (0) | 2023.07.28 |
지네릭스 용어, 지네릭 타입과 다형성 (0) | 2023.07.26 |
타입 변수 (0) | 2023.07.25 |
지네릭스 Generices (0) | 2023.07.25 |