변수의 선언이나 메서드의 매개변수를 하나의 참조 자료형이 아닌 여러 개의 자료형을 변환 될 수 있도록 프로그래밍 하는 방식
실제 사용되는 참조 자료형으로의 변환은 컴파일러가 검증하므로 안정적인 프로그래밍 방식
컬렉션 프레임워크에서 많이 사용됨
제네릭(Generic) = 일반적인
여러 참조 자료형으로 대체될 수 있는 부분을 하나의 문자로 표현하는 것
public class Generic<T>{
private T material;
public void setMaterial(T material) {
this.material = material;
}
public void getMaterial(T material) {
return material;
}
Type의 의미로 T를 많이 사용
<>: 다이아몬드 연산자
static키워드는 T를 사용할 수 없음
다이아몬드 연산자 내부에서 자료형은 생략 가능 함
제네릭에서 자료형 추론
ex)
ArrayList<String> List = new ArrayList<String>();
->
var list = new ArrayList<String>();
// var는 명확하지 않으면 사용할 수 없음
package generic;
public class Powder {
public void doPrinting() {
System.out.println("Powder 재료를 출력합니다.");
}
public String toString() {
return "재료는 Powder입니다";
}
}
public class Plastic {
public void doPrinting() {
System.out.println("Plastic 재료를 출력합니다");
}
public String toString() {
return "재료는 Plastic 입니다";
}
}
public class GenericPrinter<T> {
private T material;
public void setMaterial(T material) {
this.material = material;
}
public T getMaterial() {
return material;
}
public String toString() {
return material.toString();
}
}
public class GenericPrinterTest {
public static void main(String[] args) {
GenericPrinter<Powder> powderPrinter = new GenericPrinter<Powder>();
powderPrinter.setMaterial(new Powder());
Powder powder = powderPrinter.getMaterial();
System.out.println(powderPrinter);
System.out.println(powder);
GenericPrinter<Plastic> plasticPrinter = new GenericPrinter<Plastic>();
plasticPrinter.setMaterial(new Plastic());
Plastic plastic = plasticPrinter.getMaterial();
System.out.println(plasticPrinter);
System.out.println(plastic);
}
}
제네릭에서 대입된 자료형을 명시하지 않는 경우
자료형을 명시하지않고 사용하는 경우 자료형을 명시하라는 경고 표시
반환 형에 따라 강제 형 변환을 해야 함
GenericPrinter<> powderPrinter = new GenericPrinter<>();
powderPrinter.setMaterial(new Powder());
Powder powder = (Powder)powderPrinter.getMaterial();
System.out.println(powderPrinter);
T가 사용될 클래스를 제한하기 위해 사용
상위클래스에 정의된 메서드를 공유할 수 있음
상위클래스에서 상속받지 않은 하위 클래스는 프린터 재료로 사용할 수 없다
제네릭 메서드 활용
메서드의 매개변수를 <자료형 매개변수>로 사용하는 경우
자료형 매개변수가 하나 이상인 경우
제네릭 제한 이유
⇒ 구조와 역할을 다시 이해하고 재정리하기!
자료형 매개변수가 두 개인 경우
class GenericMethod 코드 확인하기 ( toString으로 매개변수 두개를 전달받고 출력함)