제네릭 (Generic) 프로그래밍
- 자바 5.0 버전부터
- 변수의 선언이나 메서드의 매개변수를 하나의 참조 자료형이 아닌 여러 자료형을 변환될 수 있도록 프로그래밍하는 방식
- 실제 사용되는 참조 자료형으로의 변환은 컴파일러가 검증하므로 안정적인 프로그래밍 방식
- 컬렉션 프레임워크에서 많이 사용되고 있다.
제네릭 클래스 정의하기
- 여러 참조 자료형으로 대체 될 수 있는 부분을 하나의 문자로 표현
- 이 문자를 자료형 매개변수라고 함
- T 타입에 어떤 타입들만 들어올 수 있는지 제한을 걸 수 있다. <T extends 클래스>
- 추상클래스를 구현하여 메서드를 공유할 수 있다.
- 다중 정의가 가능하다.
public class TreeDPrinter<T, V> {
private T material;
private V plastic;
}
자료형 매개 변수 T
- type의 의미로 T를 많이 사용함
- <T>에서 <>는 다이아몬드 연산자라고 함
- static 키워드에서는 T를 사용할 수 없음 / static 은 생성과 관계 없이 메모리를 할당하기 때문
- ArrayList<String> list= new ArrayList<>();
- 다이아몬드 연산자 내부에서 자료형 생략 가능
- 제네릭에서 자료형 추론 (자바 10 부터)
ArrayList<String> list = new ArrayList<String>();
var list = new ArrayList<String>(); // 이렇게 바뀜
제네릭에서 대입된 자료형을 명시하지 않는 경우
- GenericPrinter<Powder> 와 같이 사용할 자료형 (Power)를 명시해야 함
- 자료형을 명시하지 않고 사용 가능하다 이런 경우 자료형을 명시하라는 경고나 나타남
- 반환 형에 따라 강제 형변환을 해야한다.
- ArrayList도 마찬가지, Object로 간주함
제네릭 메서드 구현하기
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)p1.getY()).doubleValue();
double width = right - left;
double height = bottom - top;
return width * height;
}
public static void main(String[] args) {
Point<Interger, Double> p1 = new Point<Integer, Double>(0, 0.0);
Point<Interger, Double> p2 = new Point<>(10, 10.0);
double rect = GenericMethod.<Interger, Double>makeRectangle(p1, p2);
System.out.println("두 점으로 만들어진 사각형의 넓이는" + rect + "입니다.");
}
}
- 해당 T, V는 메서드 안에서만 유효하다.