티스토리 뷰
제한된 지네릭 클래스
- extends로 대입할 수 있는 타입을 제한
- 인터페이스인 경우에도 extends를 사용(implements X)
더보기

extends로 대입할 수 있는 타입을 제한
FruitBox<Toy> fruitBox = new FruitBox<Toy>();
fruitBox.add(new Toy()); // OK. 과일상자에 장난감을 담을 수 있다.
- FruitBox<T> 모든 타입 대입 가능
- FruitBox<T extends Fruit> Fruit의 자손만 대입 가능(Fruit 포함)
FruitBox<Apple> appleBox = new FruitBox<Apple>(); // OK.
FruitBox<Toy> toyBox = new FruitBox<Toy>(); // 에러. Toy는 Fruit의 자손이 아님

Toy는 Fruit의 자손이 아니기 때문에 위와 같이 제네릭을 사용하면 에러가 발생한다.
인터페이스인 경우에도 extends를 사용
interface Eatable {}
class FruitBox<T extends Eatable> { ... }
'implements'를 사용하지 않는다는 점에 주의하자.
예제12-3
더보기

Ex12_3 클래스들의 상속관계도
상속관계도

복잡할 땐, 클래스 간 상속관계도를 그리면 훨씬 이해하기 쉽다. 👨🏫
대입된 타입과 인터페이스를 같이 쓰기 위해서는 ','가 아닌 '&'을 사용
class FruitBox<T extends Fruit & Eatable> extends Box<T> {}
사실, Fruit이 Eatable인터페이스를 구현했기 때문에 & Eatable은 작성하지 않아도 된다.
class FruitBox<T extends Fruit> extends Box<T> {}
지네릭스의 제약
- 타입 변수에 대입은 인스턴스 별로 다르게 가능
- [제약1] static멤버에 타입 변수 사용 불가
- [제약2] 배열(또는 객체) 생성할 때(new연산자 다음에) 타입 변수 사용불가. 타입 변수로 배열 선언은 가능
더보기

타입 변수에 대입은 인스턴스 별로 다르게 가능
Box<Apple> appleBox = new Box<Apple>(); // OK. Apple객체만 저장가능
Box<Grape> grapeBox = new Box<Grape>(); // OK. Grape객체만 저장가능
[제약 1] static멤버에 타입 변수 사용 불가
class Box<T> {
static T items; // 에러
static int compare(T t1, T t2) { ... }. // 에러
...
}
static멤버는 모든 인스턴스에 공통으로 사용되기 때문에, 타입 변수를 사용할 수 없다. 타입 변수는 인스턴스마다 다르게 사용할 수 있다.
[제약 2] 배열(또는 객체) 생성할 때 타입 변수 사용불가. 타입 변수로 배열 선언은 가능
class Box<T> {
T[] itemArr; // OK. T타입의 배열을 위한 참조변수
...
T[] toArray() {
T[] tmpArr = new T[itemArr.length]; // 에러. 지네릭 배열 생성불가
...
return tmpArr;
}
...
}
T[] itemArr; // OK. T타입의 배열을 위한 참조변수
배열을 선언할 땐 괜찮다.
T[] tmpArr = new T[itemArr.length]; // 에러. 지네릭 배열 생성불가
하지만, new연산자로 생성할 땐 T가 오면 안 된다.
객체 생성 또는 배열 생성 시 T를 사용할 수 없다. new연산자는 뒤에 올 객체 또는 배열의 타입이 확정돼있어야 한다. T는 타입변수로 아직 타입이 정해지지 않았기 때문에 사용할 수 없는 것이다.

쉽게 얘기해서 new연산자 다음에 타입 변수 사용 불가.
'Java의 정석_기초편' 카테고리의 다른 글
| 지네릭 타입의 형 변환 (0) | 2022.11.08 |
|---|---|
| 와일드카드 & 지네릭 메서드 (0) | 2022.11.08 |
| Iterator<E>, HashMap<K,V> (0) | 2022.11.07 |
| 지네릭스 용어 (0) | 2022.11.07 |
| 지네릭스란 & 타입 변수 (0) | 2022.11.07 |
댓글
공지사항
