본문 바로가기

Programming/JAVA

제네릭(6) - 제네릭 타입의 상속과 구현

java logo image

 

 

제네릭 타입(클래스)도 당연히 같은 레벨의 다른 클래스와 동일하게 부모-자식 클래스의 구현이 가능합니다. 물론 타입 파라미터에 대한 통일성을 가져야 상속이 가능하겠죠? 잘 이해가 가지 않는다면 아래와 같이 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
*/