TIL
제네릭이란
하얀잔디
2022. 10. 4. 14:21
아직도 잘 모르는 개념이다. 정리해보려고 글쓴당.
Class와 Method의 매개변수를 나중에 확정한다.
-> 자바의 타입 안정을 보장.
public class GenericEx {
public static void main(String[] arg){
A a = new A(400);
a.Print();
}
static class A {
int num;
public Put(int num){
this.num = num;
}
public void Print(){
System.out.println("num : " + num);
}
}
}
간단한 코드다. int를 생성자에서 받아 콘솔에 보여준다.
그러면 String이나 Double을 받아서 print하려면 어떻게할까?
그냥 3가지 클래스를 각각 만들면 될 것이다!!
BUT 복잡성도 높아지고 중복이 싫으니까
public class GenericEx {
public static void main(String[] arg){
PrintGeneric printGeneric1 = new PrintGeneric(400);
printGeneric1.GenericPrint();
PrintGeneric printGeneric2 = new PrintGeneric(29.99);
printGeneric2.GenericPrint();
PrintGeneric printGeneric3 = new PrintGeneric("LGU+");
printGeneric3.GenericPrint();
}
static class PrintGeneric <T>{
T genericT;
public PrintGeneric(T genericT) {
this.genericT = genericT;
}
public void GenericPrint(){
System.out.println("GenericNum : " + genericT);
}
}
이런식으로 하는 것이다.
타입마다 메소드를 개발할 필요가 없으며, 해당 메소드 사용 시 개발자가 변수 타입을 직접 지정할 수 있다.
-> 여기까진 쉽다. 하지만 기본 함수들을 파고 파다 보면은,
어떤 클래스를 상속받은 객체가 와야 하는 경우는 어떨까?
이럴때가
<T extend 클래스> 로 하면 된다.
ex)
요약하면, 데이터 타입을 미리 정의하지 않고, 클래스를 인스턴스화 하는 시점에 데이터를 지정해 주는 방싟이다.
클래스 -> 실제 객체 로 만들때 데이터값을 지정해줌. 중복제거를 위함.
참고: https://erjuer.tistory.com/103
2가지 제네릭도 사용 가능함, List<?> 같은 경우에는 List 안에 뭐가 들어갈지 모를때 저렇게 함.