자료구조 #10 - < T extend 클래스 >

HongInSung·2022년 11월 29일
0
post-thumbnail

이 포스트는 FastCampus에 이 강의를 보고 포스팅되었습니다.
문제가 될 시 삭제될 예정입니다.

< T extend Class > 왜 써야됨?

제네릭 타입을 쓰면 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());
    }
}

오류가 사라졌습니다! 만세!

코드 좀

위 코드들은 전부 제 깃허브에 올라가 있습니다.

다음시간엔 뭐할거임?

다음시간엔 제네릭 메서드를 다뤄보도록 하겠습니다.
수고하셨습니다.

profile
안녕하세요! 풀스택 노려보고 있는 홍인성입니다!

0개의 댓글