본문 바로가기
Languages/Java

[Java] 제네릭 (4) 제네릭 타입의 상속과 구현

by 이래지 2021. 12. 28.
728x90

제네릭 타입의 상속과 구현


제네릭 타입도 다른 타입과 마찬가지로 부모 클래스가 될 수 있다.

사용 예시

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 T getModel() { return this.model; }
    
    public void setKind(T kind)  { this.kind = kind; }
    public void setMoel(M model) { this.model = model; }
}

class Tv{}
  • 자식 제네릭 클래스
// 자식 제네릭 클래스
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; }
}

 

제네릭 인터페이스를 구현한 클래스도 제네릭 타입이 될 수 있다.

사용 예제

  • 제네릭 인터페이스
// 제네릭 인터페이스
public interface Storage<T> {
	public void add(T item, int index);
    public T get(int index);
}
// 제네릭 구현 클래스
public class StorageImpl<T> implements Storage<T> {
	private T[] array;
    
    public StorageImpl(int capacity) {
    	this.array = (T[]) (new Object[capacity]);
        // 타입 파라미터로 배열을 생성하려면 new T[n]형태로 생성할 수 없고, 
        //(T[])(new Object[n]) 으로 생성해야한다.
    }
    
    @Override
    public void add(T item, int index) {
    	array[index] = item;
    }
    
    @Override
    public T get(int index) {
    	return array[index]
    }
}
* 타입 파라미터로 배열을 생성하려면 new T[n]형태로 생성할 수 없고, (T[])(new Object[n]) 으로 생성해야한다.

 

  • ChildProduct<T, M, C> 와 StorageImpl<T> 클래스를 사용하는 예제
// 제네릭 타입 사용 클래스
public class ChildProductAndStorageExample {
	public static void main(String[] argsa) {
    	ChildProduct<Tv, String, String> product = new ChildProduct<>();
        product.setKind(new Tv());
        product.setModel("SmartTV");
        product.setCompany("Samsung");
        
        Storage<Tv> storage = new StorageImpl<Tv>(100);
        storage.add(new Tv(), 0);
        Tv tv = storage.get(0);
    }
}

댓글