이 포스트는 FastCampus에 이 강의를 보고 포스팅되었습니다.
문제가 될 시 삭제될 예정입니다.
제네릭 타입을 쓰면 T 위치에 어느 자료형이든 들어가도 상관이 없습니다.
하지만 전에 말했던것처럼 어느 자료형이든 들어가게 된다면 문제가 생길 수 있습니다.
만약에 3D 프린터에 재료로 물을 넣는다? 그 3D 프린터는 바로 폐기가 되버릴 것입니다.
그래서 이 타입에 대한 제한을 두기위해 상속을 이용하는 겁니다.
상위 클래스에서 상속 받은 클래스만 T 대신에 쓸 수 있다는 겁니다.
저번에 제네릭 사용법때 사용한 예시를 T extend Class로 바꿔보겠습니다.
상위 클래스인 Material을 만들어보겠습니다.
보통 T extend Class에서는 상위 클래스를 abstract로 구현합니다.
public abstract class Material {
// no code
}
그리고 GenericPrinter 클래스에 Material을 상속시켜 보겠습니다.
( T에다 상속시켜야 함. )
public class GenericPrinter<T extends Material> {
public T material;
public T getMaterial() {
return material;
}
public void setMaterial(T material) {
this.material = material;
}
public String toString() {
return material.toString();
}
}
마찬가지로 Plastic에 Material을 상속시켜보고 테스트 코드를 돌려보겠습니다.
public class ThreeDPrinterExtendTest {
public static void main(String[] args) {
GenericPrinter<Powder> GP = new GenericPrinter<>();
// 이쪽에서 오류가 발생했습니다.
// 이유는 이 Powder가 Material을 상속받지 않았기 때문입니다.
// Type parameter 'threeDPrinterWithTextend.Powder' is not within its bound
Powder pw = new Powder();
GP.setMaterial(pw);
System.out.println(GP.toString());
}
}
전 테스트 코드를 그대로 가져왔더니 오류가 생겼습니다.
일단 Powder도 상속시켜보고 테스트 코드를 다시 돌려보겠습니다.
public class Powder extends Material{
public String toString() {
return "재료는 Powder 입니다.";
}
}
public class ThreeDPrinterExtendTest {
public static void main(String[] args) {
GenericPrinter<Powder> GP = new GenericPrinter<>();
Powder pw = new Powder();
GP.setMaterial(pw);
System.out.println(GP.toString());
}
}
오류가 사라졌습니다! 만세!
위 코드들은 전부 제 깃허브에 올라가 있습니다.
다음시간엔 제네릭 메서드를 다뤄보도록 하겠습니다.
수고하셨습니다.