JAVA

5-8.T extends 클래스

개발자 김혜린 2022. 2. 21. 17:18

<T extends 클래스> 사용하기

5-7까지의 테스트 프로그램에선,

만약 프린터에 water 재료를 넣어도 가능했다.....

그렇다면 제한을 해줘야 하지 않을까?

 

상위 클래스의 필요성

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

T extends 를 사용한 프로그래밍

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

T에 아무거나 들어가지 않게 Material로 제한

더보기

Material

package ch07;

public abstract class Material { //직접 쓸 일이 없기 때문에 abstract로 선언
	//재료들이 공통으로 사용할 메서드들은 이곳에 선언하면 된다.
	
	public abstract void doPrinting();
}

Plastic

package ch07;

public class Plastic extends Material { //상속을 받아주면 된다.
	
	public String toString() {
		return "재료는 Powder 입니다.";
	}

@Override
public void doPrinting() {
	// TODO Auto-generated method stub	
	}		
}

Powder

package ch07;

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

	@Override
	public void doPrinting() {
		// TODO Auto-generated method stub
	}
}

GenericPrinter

package ch07;

public class GenericPrinter<T extends Material> { //extends를 함으로써 T에 제한을 둔다. 
	private T material;
	
	public T getMaterial() {
		return material;
	}
	
	public void setMaterial(T material) {
		this.material=material;
	}
	
	public String toString() {
		return material.toString();
	}
}

GenericPrinterTest

package ch07;

public class GenericPrinterTest {

	public static void main(String[] args) {
		
		Powder powder = new Powder();
		GenericPrinter<Powder> powderPrinter = new GenericPrinter<>(); // Powder가 Material에서 상속을 받지 않으면 오류가 난다 
		powderPrinter.setMaterial(powder);
		
		Powder p = powderPrinter.getMaterial();
		System.out.println(powderPrinter.toString());
	}
}