자바_제네릭

제네릭 프로그래밍이란

클래스 내부에서 사용할 데이터의 종류를 외부적으로 지정하는 기법이다.

즉, 다양한 데이터 유형을 적용할 수 있는 클래스를 만듭니다.


일반반

클래스 선언 옆의 제네릭 형식 매개 변수를 사용하는 경우 이를 제네릭 클래스라고 합니다.

와는 별개로 <E>(요소),(키) 및 (값).


출처: 인파의 차이야기

▼예시

플라스틱

package ch03;

public class Plastic {
	@Override
	public String toString() {

		return "재료는 플라스틱입니다.

"; } }

가루

package ch03;

public class Powder {
	@Override
	public String toString() {
		return "재료는 파우더입니다.

"; } }

일반 클래스인 GenericPrinter 클래스입니다.

package ch03;

public class GenericPrinter<T> {
	
	// 제네릭 자료형. T자료형으로 선언한 변수 material
	private T material;
	
	// 제네릭 메서드-T자료형을 반환하는 제네릭 메서드
	// T타입의 값 material을 반환
	public T getMaterial() {
		return material;
	}
	// T타입의 값을 멤버 변수 material에 대입
	public void setMaterial(T material) {
		this.material = material;
	}

}

주요 테스트 클래스

package ch03;

public class GenericPrinterMainTest {

	public static void main(String() args) {
		Powder powder = new Powder();
		Plastic plastic = new Plastic();

		// 제네릭 클래스 사용 방법
		GenericPrinter<Powder> genericPrinter = new GenericPrinter<>();

		// 재료 넣기
		genericPrinter.setMaterial(powder);
		// 최상위 클래스인 Object를 활용하는 것보다 안정적인 코드를 만들 수 있다.

// 가독성도 높아진다.

// 재료 꺼내기 Powder usePowder = genericPrinter.getMaterial(); // 다운캐스팅 할 필요가 없다.

// 잘못된 데이터 타입을 대입하면 컴파일 시점에 오류를 잡아준다.

// 같은 변수 이름과 같은 기능일 때 제네릭으로 프로그래밍을 설계하면 된다.

} // end of main } // end of class

T 확장 클래스

T 데이터 유형의 범위를 제한할 수 있습니다.

▼예시

재료

package ch04;

public abstract class Material {

	public abstract void doprinting();

}

Plastic 클래스는 Material 클래스에서 상속됩니다.

package ch04;

public class Plastic extends Material {
	@Override
	public String toString() {

		return "재료는 플라스틱입니다.

"; } @Override public void doprinting() { System.out.println("plastic재료로 출력합니다.

"); } }

Powder 클래스는 Material 클래스에서 상속됩니다.

package ch04;

public class Powder extends Material {
	@Override
	public String toString() {
		return "재료는 파우더입니다.

"; } @Override public void doprinting() { System.out.println("powder재료로 출력합니다.

"); } }

Water 클래스는 어떤 것에서도 상속받지 않습니다.

package ch04;

public class Water {
	@Override
	public String toString() {

		return "재료는 플라스틱입니다.

"; } }

일반 클래스인 GenericPrinter 클래스입니다.

package ch04;

// T는 Material을 상속받은 녀석으로 제한
public class GenericPrinter<T extends Material> {
	private T material;

	public T getMaterial() {
		return material;
	}

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

	@Override
	public String toString() {

		return material.toString();
	}

}

주요 테스트 클래스

package ch04;

public class MainTest {

	public static void main(String() args) {
		GenericPrinter<Powder> genericPrinter1 = new GenericPrinter<>();
		GenericPrinter<Plastic> genericPrinter2 = new GenericPrinter<>();
//		GenericPrinter<Water> genericPrinter3 = new GenericPrinter<>();
//		상속 안 받아서 오류남

		// 재료 넣기
		genericPrinter1.setMaterial(new Powder());
		genericPrinter2.setMaterial(new Plastic());

	}

}