상속을 활용한 제네릭 자료형 제한하기

수정이·2022년 4월 13일
0

JAVA

목록 보기
5/8
post-thumbnail

왜 제한을 해야하죠?


  • 제네릭 자료형을 제한함으로써 무작위 클래스가 들어가는 것을 방지할 수 있다.
    • 예를 들어, 3D프린터의 재료에 Water 클래스를 넣는 것을 방지할 수 있다.
  • 상위 클래스에서 선언하거나 정의하는 메소드를 활용할 수 있다.

선언 및 구현


  • Material 클래스를 상속받은 클래스만 제네릭 자료형에 들어갈 수 있다.
  • <T extends 클래스> 를 사용하여 제한한다.
// Material.java
public abstract class Material { // 직접 인스턴스화가 될 필요가 없으므로 추상 클래스로 선언해도 괜찮다.
	
	public abstract void doPrinting();
}
// Powder.java
public class Powder extends Material{
		
	public void doPrinting() {
		System.out.println("Powder 재료로 출력합니다");
	}
	
	public String toString() {
		return "재료는 Powder 입니다";
	}
}
// Plastic.java
public class Plastic extends Material{

	public void doPrinting() {
		System.out.println("Plastic 재료로 출력합니다");
	}
	
	public String toString() {
		return "재료는 Plastic 입니다";
	}
}
// GenericPrinter.java
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();
	}
}
// GenericPrinterTest.java
public class GenericPrinterTest {

	public static void main(String[] args) {

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

0개의 댓글