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 안에 뭐가 들어갈지 모를때 저렇게 함.