제네릭(Generic) 프로그래밍

인프런 Do it! 자바 프로그래밍 입문 수강 중

제네릭 프로그래밍이란?

변수의 선언이나 메서드의 매개변수를 하나의 참조 자료형이 아닌 여러 자료형을 변환 될 수 있도록 프로그래밍 하는 방식. 실제 사용되는 참조 자료형으로의 변환은 컴파일러가 검증하므로 안정적인 프로그래밍 방식이며 컬렉션 프레임워크에서 많이 사용되고 있다.

제네릭 클래스란?

여러 참조 자료형으로 대체 될 수 있는 부분을 하나의 문자로 표현하며 이 문자를 자료형 매개변수라고 한다.

예시

public class ThreeDPrinter<T extends Material> {  //상속받은 것만으로 제한 할 수도 있음
	private T material;

	public T getMaterial() {
		return material;
	}

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

자료형 매개 변수 T

  • type의 의미로 T를 많이 사용 함
  • <T>에서 <>는 다이아몬드 연산자라고 함
  • static 키워드는 T에 사용할 수 없음
  • 다이아몬드 연산자 내부에서 자료형은 생략 가능
    ArrayList<String> list = new ArrayList<>();
    
  • 제네릭에서 자료형 추론 (자바10부터 가능)
    ArrayList<String> list = new ArrayList<String>();
    ➡️ var list = new ArrayList<String>();
    

제네릭 클래스 사용

ThreeDPrinter<Powder> printer = new ThreeDPrinter<Powder>();
printer.setMaterial(new Powder());
Powder powder = printer.getMaterial();  //명시적 형 변환 필요 없음
System.out.println(printer);
용어설명
GenericPrinter제네릭 자료형(Generic type), 매개변수화된 자료형(parameterized type)
Powder대입된 자료형

T extends 클래스
T가 사용될 클래스를 제한하기 위해 사용

public class Plastic extends Material{
	...
}
public class Powder extends Material{
	...
}
public class Water{
	...
}
public class ThreeDPrinter<T extends Material> { //상속받은 것만으로 제한한다
	...
}

Material을 상속받은 Plastic, Powder만 사용이 가능하고 Water는 사용이 불가능하다.


제네릭 메서드

메서드의 매개변수를 자료형 매개변수로 사용하는 경우 또는 자료형 매개 변수가 하나 이상인 경우

제네렉 메서드의 일반 형식

public <자료형 매개변수> 반환형 메서드 이름(자료형 매개변수 ...) {}

자료형 매개 변수가 두 개인 경우

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 T 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)p3.getY()).doubleValue();
		double bottom = ((Number)p4.getY()).doubleValue();
		
		double width = right - left;
		double height = bottom - top;

		return width * height;
	}
}

Main문

Point<Integer, Double> p1 = newe Point<Integer, Double>(0, 0.0);
Point<Integer, Double> p2 = newe Point<>(10, 10.0);

double rect = GenericMethod.<Integer, Double>makeRectangle(p1, p2);

끝!