[JAVA] 제네릭
제네릭(Generic) 프로그래밍
- 변수의 선언이나 매서드의 매개변수를 하나의 참조 자료형이 아닌 여러 자료형을 변환될 수 있도록 프로그래밍하는 방식
- 실제 사용되는 참조 자료형으로의 변환은 컴파일러가 검증하므로 안정적이 프로그래밍 방식
- 컬렉션 프레임워크에서 많이 사용되고 있음
제네릭 클래스 정의하기
- 여러 참조 자료형으로 대체 될 수 있는 부분을 하나의 문자로 표현
- 이 문자를 자료형 매개 변수라고 함
public class GenericPrinter<T>{ // GenericPrinter 제네릭 클래스 T type와 약자, 자료형 매개변수
private T material;
public void serMaterial(T material){
this.material = materia;
}
public T getMaterial(){
return material;
}
}
제네릭 클래스 사용하기
Genericnter<Powder> powderPrinter = new GenericPrinter<Powder>();
powderPrinter.setMaterial(new Powder());
Powder powder = powderPrinter.getMaterial(): // 명시적 형 변환을 하지않음
T로 정의한 부분에 사용할 참조 자료형을 넣어서 클래스 생성
getMaterial() 메서드가 호출될 때 따라 강제 형변환을 하지 않아도 됨
용어 | 설명 |
GenericPrinter<Powder> | 재네릭 자료형(Generic type), 매개변수화된 자료형(parameterized type) |
Powder | 대입된 자료형 |
제네릭 클래스 사용예제
pulic class GenericPrinterTest{
public static void main(Sting[] args){
GenericPrinter<Powder> powderPrinter = new GenericPrinter<Powder>(); // Powder형으로 GenericPrinter 클래스 생성
powderPrinter.setMaterial(new Powder());
Powder powder = powderPrinter.getMaterial();
System.out.println(powderPrinter);
GenericPrinter<Plastic> plasticPrinter = new GenericPrinter<Plastic>(); // Plastic형으로 GeneticPrinter 클래스 생성
plasticPrinter.setMaterial(new Plastic());
plastic plastic = plasticPrinter.gerMaterial();
System.out.println(plasticPrinter);
}
}
제네릭에서 대입된 자료형을 명시하지 않는 경우
- GenericPrinter<powder>와 같이 사용할 자료형 (Powder)를 명시해야 함
- 자료형을 명시하지 않고 사용할 수 있음
-> 이런 경우 자료형을 명시하라는 경교 표시가 나타남
- 반환형에 따라 강제 형 변환을 해야 함
Genericprinter powderPrinter2 = new GenericPriner (); // 대입된 자료형 <Powder>를 명시하지 않음
powderPrinter2.setMaterial(new Powder());
Powder powder = (powder)podwePrinter.getMaterial(); // (Powder) 강제형변환
System.out.println(powderPrinter);
T extends 클래스
- T가 사용될 클래스를 제한하기 위해 사용
- Material에서 상속받지 않은 Water와 같은 클래스는 프린터 재료로 사용할 수 없음
- Material에 정의된 매서드를 공유할 수 있음
자료형 매개 변수가 두 개인 경우
public class PotintM<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;
}
}
- T, V 두개의 자료형 매개 변수 사용
재네릭 메서드 활용하기
- 매서드의 매개변수를 자료형 매개변수로 사용하는 경우
- 자료형 매개 변수가 하나 이상인 경우
- 재네릭 메서드의 일반 형식
public<자료형 매개변수> 반환용 매소두 아룸(자료형 매개변수 ... ){}
//제네락 메서드 구현하기
//- 사각형의 너비를 구하는 매서드
//- 두점의 위치가 여러 자료형으로 사용되는 경우
public class GenericMethod{
public static <T,V> douvle makeRectangle(Point<T,V> p1, Point<T,V> p2){
double left = ((Number)p1.getX()).doublrValue();
double right = ((Number)p2.getX()).doublrValue();
double top = ((Number)p1.getY()).doublrValue();
double bottom = ((Number)p2.getY()).doublrValue();
double width = right - left;
double height = bottom - top;
return width * height;
}
//재네릭 메서드 사용하기
public static void main(Sting[] 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+"입니다");
}
}