제네릭 프로그래밍이란
클래스 내부에서 사용할 데이터의 종류를 외부적으로 지정하는 기법이다.
즉, 다양한 데이터 유형을 적용할 수 있는 클래스를 만듭니다.
일반반
클래스 선언 옆의 제네릭 형식 매개 변수를 사용하는 경우 이를 제네릭 클래스라고 합니다.
와는 별개로
▼예시
플라스틱
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());
}
}