본문 바로가기
카테고리 없음

제네릭 <T extends 클래스> 사용 제한

by step 1 2021. 5. 2.
반응형

상위 클래스의 필요성

  • T 자료형의 범위를 제한 할 수 있음
  • 상위 클래스에서 선언하거나 정의하는 메서드를 활용할 수 있음
  • 상속을 받지 않는 경우 T는 Object로 변환되어 Object 클래스가 기본으로 제공하는 메서드만 사용가능

T extends를 사용한 프로그래밍

  • GenericPrinter에 material 변수의 자료형을 상속받아 구현
  • T에 무작위 클래스가 들어갈 수 없게 Material 클래스를 상속받은 클래스로 한정
package ch45;

// 직접 사용하지 않기 때문에 추상클래스로 선언
public abstract class Material {

	public abstract void doPrinting();
}
package ch45;

public class Plastic extends Material{

	public String toString() {
		return "재료는 Plastic 입니다";
	}

	@Override
	public void doPrinting() {
		System.out.println("Plastic 재료로 출력합니다");
		
	}
}
package ch45;

public class Powder extends Material{

	public String toString() {
		return "재료는 Powder 입니다";
	}

	@Override
	public void doPrinting() {
		System.out.println("Powder 재료로 출력합니다");
		
	}
}
package ch45;

// T에 대한 제한을 둠
public class GenericPrinter<T extends Material> {

	private T material;

	public void setMaterial(T material) {
		this.material = material;
	}

	public T getMaterial() {
		return material;
	}

	public String toString() {
		return material.toString();
	}
	
	public void printing() {
		material.doPrinting();
	}
}
package ch45;

public class GeneriPrinterTest {

	public static void main(String[] args) {

		GenericPrinter<Powder> powderPrinter = new GenericPrinter<Powder>();
		powderPrinter.setMaterial(new Powder());
		Powder powder = powderPrinter.getMaterial(); // 형변환 하지 않음
		System.out.println(powderPrinter);
		powderPrinter.printing();
		
		System.out.println("=========================");
		
		GenericPrinter<Plastic> plasticPrinter = new GenericPrinter<Plastic>();
		plasticPrinter.setMaterial(new Plastic());
		Plastic plastic = plasticPrinter.getMaterial(); // 형변환 하지 않음
		System.out.println(plasticPrinter);
		plasticPrinter.printing();
		
	/*	GenericPrinter powderPrinter2 = new GenericPrinter();
		powderPrinter2.setMaterial(new Powder());
		Powder powder = (Powder)powderPrinter.getMaterial();
		System.out.println(powderPrinter);
		*/
		//GenericPrinter<Water> printer = new GenericPrinter<Water>();	
		
	}
}

반응형