제네릭 타입(클래스)도 당연히 같은 레벨의 다른 클래스와 동일하게 부모-자식 클래스의 구현이 가능합니다. 물론 타입 파라미터에 대한 통일성을 가져야 상속이 가능하겠죠? 잘 이해가 가지 않는다면 아래와 같이 Product와 ChildProduct사이의 상속 선언 형태를 보겠습니다.
public class ChildProduct<T, M> extends Product<T, M> { //... }
부모 클래스를 상속하는 자식 클래스는 (당연하게도) 자신만의 고유 필드나 메서드를 갖게 됩니다. 타입 파라미터도 비슷하게 생각해 주시면 됩니다. 자식 제네릭 타입의 경우 자신만의 타입 파라미터를 가질 수 있습니다.
public class ChildProduct<T, M, C> extends Product<T, M> { // ... }
그럼 간단한 예제를 통해서, 제네릭 타입 클래스의 상속 사례를 테스트해 보겠습니다.
public class Product<T, M> {
private T kind;
private M model;
public T getKind() {
return this.kind;
}
public M getModel() {
return this.model;
}
public void setKind(T kind) {
this.kind = kind;
}
public void setModel(M model) {
this.model = model;
}
}
public class Tv {
}
우선 기본 제네릭 타입인 Product<T, M>과 일반 클래스 Tv를 선언했습니다. 이제 이 Product<T, M>을 상속하는 자식 클래스를 선언해 보겠습니다.
public class ChildProduct<T, M, C> extends Product<T, M>{
private C company;
public C getCompany() {
return this.company;
}
public void setCompany(C company) {
this.company = company;
}
}
자식 클래스인 ChildProduct<T, M, C>는 고유의 타입 파라미터 C를 가지고 있습니다. 그리고 C 타입을 이용한 getter와 setter가 선언되어 있습니다.
이번에는 제네릭 인터페이스도 등장합니다. Storage라는 인터페이스가 제네릭으로 선언되었다고 가정해 보겠습니다.
public interface Storage<T> {
public void add(T item, int index);
public T get(int index);
}
그리고 이 Storage<T>를 구현하는 구현 클래스도 필요할 것입니다. 그렇다면 이 구현 클래스 역시 제네릭 타입으로 선언되어야 합니다.
public class StorageImpl<T> implements Storage<T> {
private T[] array;
public StorageImpl(int capacity) {
this.array = (T[]) (new Object[capacity]);
}
@Override
public void add(T item, int index) {
array[index] = item;
}
@Override
public T get(int index) {
return array[index];
}
}
이제 실행 클래스에서 위 선언문들을 이용해 보겠습니다.
public class ExampleMain {
public static void main(String[] args) {
ChildProduct<Tv, String, String> product = new ChildProduct<>();
product.setKind(new Tv());
product.setModel("Smart TV");
product.setCompany("SAMSUNG");
Storage<Tv> storage = new StorageImpl<Tv>(100);
storage.add(new Tv(), 0);
Tv tv = storage.get(0);
System.out.println(product.getModel());
}
}
/* 출력
Smart TV
*/
'Programming > JAVA' 카테고리의 다른 글
람다식(2) - 람다식의 타겟 타입, 함수적 인터페이스 1 (1) | 2023.05.12 |
---|---|
람다식(1) - 람다식의 정의와 기본 문법 (0) | 2023.05.10 |
제네릭(5) - 와일드카드 타입 (0) | 2023.05.06 |
제네릭(4) - 제한된 타입 파라미터 선언 (0) | 2023.05.03 |
제네릭(3) - 제네릭 메서드 3 (0) | 2023.05.02 |