본문 바로가기

Java 공부

13장 제네릭(Generic)(6)_제네릭 타입의 상속과 구현

제네릭 타입의 부모클래스를 상속할 경우 자식 클래스 또한 제네릭 타입이어야 한다.

부모클래스에 기술된 타입 파라미터는 자식클래스에도 기술해야 한다.

public class ChildProduct<T,M> extends Product<T,M> { ... }

또한 자식 클래스는 추가적인 타입 파라미터를 가질 수 있다.

public class ChildProduct<T,M,C> extends Product<T,M> { ... }


제네릭 타입 인터페이스를 구현하는 구현객체일 경우 구현클래스도 제네릭 타입이어야 한다.

인터페이스에 기술된 타입파라미터가 구현클래스에도 기술되어야 한다.

public class StorageImpl<T> implements Storage<T> { ... }


즉,   제네릭 타입의 클래스를 상속하려면 자식 클래스도 제네릭 , 타입 파라미터도 그대로 기술  + 추가기술 가능

 제네릭 타입의 인터페이스를 구현하려면 구현클래스도 제네릭, 타입 파라미터도 그대로 기술

이라고 할 수 있다.



예제>>

제네릭 타입 부모클래스 (Product) 

public class Product<T, M> {

private T kind;

private M model;

public T getKind() {

return kind;

}

public void setKind(T kind) {

this.kind = kind;

}

public M getModel() {

return model;

}

public void setModel(M model) {

this.model = model;

}

}


class Tv { }



Product클래스를 상속받는 자식 클래스(ChildProduct)

public class ChildProduct<K,V,C> extends Product<K,V>{

private C company;


public C getCompany() {

return company;

}


public void setCompany(C company) {

this.company = company;

}

}



제네릭 타입의 인터페이스(Storage)

public interface Storage<T> {

public void add(T item, int index);

public T get(int index);

}

--> 인터페이스는 "객체 사용설명서" 라고 할 수 있다. 그러므로 자체적으로 객체를 만들 수 없음!

객체를 만들 때에 필요한 안내만 되어 있을 뿐! 따라서 메소드의 구현부를 기술하지 않는 추상메소드만 가진다!



구현객체(StorageImpl)

public class StorageImpl<T> implements Storage<T> {


private T[] array;

//생성자

public StorageImpl(int capacity) {

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];

}

}

--> 인터페이스에 정의되어 있는 추상메소드를 필히 재정의 해준다!



실행클래스(ChildProductAndStroageExample)

public class ChildProductAndStroageExample {


public static void main(String[] args) {

ChildProduct<Tv,String,String> product = new ChildProduct<>();

product.setKind(new Tv());

product.setModel("SmartTV");

product.setCompany("Samsung");

StorageImpl<Tv> storage = new StorageImpl<>(100);

storage.add(new Tv(), 0);

Tv tv = storage.get(0);

}

}







본 포스팅은 이것은 자바다 책을 참고하여 작성하였습니다.