java/ㄴ CHAPTER 12. 제네릭스, 열거형, 애너테이션

CHAPTER 12. (2) 제한된 제네릭 클래스란? (제네릭스 제약 포함)

Astaroth아스 2020. 4. 23. 15:23

제한된 제네릭 클래스
 - 사용할 타입 명시하면, 한 종류 타입만 저장할 수 있도록 제한 가능
 but 여전히 모든 종류 타입 지정 가능 
 => 지정할 수 있는 타입 종류 제한하는 방법?


ex.
FruitBox fruitBox = new FruitBox();
fruitBox.add(new Toy()); // 과일 박스에 장난감 담기 가능

1. 지네릭 타입에 extends 사용, 특정 타입 자손만 대입 가능

ex.
class FruitBox { // Fruit의 자손만 타입으로 지정 가능
ArrayList list = new ArrayList();
}
FruitBox appleBox = new FruitBox(); // 가능
FruitBox toyBox = new FruittBox(); // 오류, Toy는 Fruit의 자손이 아님


2. 인터페이스 구현 시 extends 사용 (☆ implements 아님)
ex.
interface Eatable {
}
class FruitBox { ... }


3. 클래스 Fruit 자손이면서 Eatable 인터페이스 구현해야 한다면 & 기호로 연결
ex.
class FruitBox  { ... }



제네릭스 제약
 - static 멤버에 타입변수 T 사용 불가 (T는 인스턴스 변수로 간주됨)
 => static 멤버는 인스턴스 변수 참조 불가
 왜? = static멤버는 타입 변수에 지정된 타입 (대입된 타입 종류에 관계없이 동일한 것)이어야 하기 때문

 - 제네릭 타입 배열 생성 허용되지 않음
 왜? new 연산자는 컴파일 시점에 타입 T가 뭔지 정확히 알아야 함
 = Box 클래스 컴파일 시점에서 T가 어떤 타입이 될지 알 수 없음 (같은 이유로 instanceof 연산자도 T를 피연산자로 사용 불가)



 - 제네릭 클래스 생성 시, 참조변수에 지정된 제네릭 타입과 생성자에 지정된 제네릭 타입 일치해야 함 (상속관계라도 마찬가지)