1. 제네릭(Generic) 프로그래밍
클래스, 메서드, 인터페이스에서 처리 되는 자료형을 외부에서 지정하는 기법으로써 자료형에 의존적으로 정의하지 않아도 됨
2. 제네릭 프로그래밍이 필요한 상황
public class Powder {
public String toString() {
return "재료는 Powder 입니다";
}
}
public class ThreeDPrinter1{
private Powder material;
public void setMaterial(Powder material) {
this.material = material;
}
public Powder getMaterial() {
return material;
}
public class Plastic {
public String toString() {
return "재료는 Plastic 입니다";
}
}
public class ThreeDPrinter2{
private Plastic material;
public void setMaterial(Plastic material) {
this.material = material;
}
public Plastic getMaterial() {
return material;
}
}
3. 제네릭 프로그래밍 구현
public class GenericPrinter<T> { # T 자료형을 처리하는 클래스
private T material; # T 자료형으로 선언한 변수
public void setMaterial(T material) { # T 자료형을 매개변수로 받는 제네릭 메서드
this.material = material;
}
public T getMaterial() { # T 자료형을 반환하는 제네릭 메서드
return material;
}
public String toString(){
return material.toString();
}
}
# main 부분
GenericPrinter<Powder> powderPrinter = new GenericPrinter<Powder>();
powderPrinter.setMaterial(new Powder());
GenericPrinter<Plastic> plasticPrinter = new GenericPrinter<Plastic>();
plasticPrinter.setMaterial(new Plastic());
1. T extends 클래스
제네릭 자료형의 범위를 제한 할 수 있는 기법으로 상속 받는 상위 클래스의 자료형 또는 해당 클래스를 상속 받은 하위 클래스들의 자료형만으로 제한하는 기법
2. T extends 클래스 적용
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();
}
}
public abstract class Material {
public abstract void doPrinting();
}
public class Powder extends Material{
public void doPrinting() {
System.out.println("Powder 재료로 출력합니다");
}
public String toString() {
return "재료는 Powder 입니다";
}
}
public class Plastic extends Material{
public void doPrinting() {
System.out.println("Plastic 재료로 출력합니다");
}
public String toString() {
return "재료는 Plastic 입니다";
}
}
1. 제네릭(Generic) 메서드
메서드의 반환형 및 매개변수의 자료형과 내부에서 처리되는 자료형을 제네릭 자료형으로 사용하는 메서드
2. 제네릭 메서드 활용
public class Point<T, V> {
T x;
V y;
Point(T x, V y){
this.x = x;
this.y = y;
}
public T getX() {
return x;
}
public V getY() {
return y;
}
}
public class GenericMethod {
public static <T, V> double makeRectangle(Point<T, V> p1, Point<T, V> p2) {
double left = ((Number)p1.getX()).doubleValue();
double right =((Number)p2.getX()).doubleValue();
double top = ((Number)p1.getY()).doubleValue();
double bottom = ((Number)p2.getY()).doubleValue();
double width = right - left;
double height = bottom - top;
return width * height;
}
public static void main(String[] args) {
Point<Integer, Double> p1 = new Point<Integer, Double>(0, 0.0);
Point<Integer, Double> p2 = new Point<>(10, 10.0);
double rect = GenericMethod.<Integer, Double>makeRectangle(p1, p2);
System.out.println("두 점으로 만들어진 사각형의 넓이는 " + rect + "입니다.");
}
}