제네릭(Generic)은 '데이터 형식에 의존하지 않고, 하나의 값이 여러 다른 데이터 타입들을 가질 수 있도록 하는 방법'이다.

객체 생성시 변수의 형태를 여러가지로 하려면 다형성을 이용하면 된다.

이게 형 변환을 변수마다 다르게 실시해야 하기 때문에 조금 불편함

class Sample{
    //Field
    private Object obj;

    Sample(Object x){
        this.obj = x;
    }

    public Object getObj() {
        return obj;
    }

    void printInfo(){
        System.out.println(obj.getClass().getName());
    }
}
public class Test {

    public static void main(String[] args) {

        Sample A = new Sample("안녕하세요");
        System.out.println(A.getObj());
        String str = (String)A.getObj();
//형 변환이 없으면 String str의 값을 A.getObj()로 못 넣는다.
//String 관련 메서드도 사용할 수가 없음.

        A.printInfo();

        Sample B = new Sample(100);
        System.out.println(B.getObj());
        int num = (int)B.getObj();
        B.printInfo();
//int도 마찬가지

        Sample C = new Sample(new Object());
        System.out.println(C.getObj());
        C.printInfo();
    }
}

//안녕하세요
//java.lang.String
//100
//java.lang.Integer
//java.lang.Object@4eec7777
//java.lang.Object
// 형변환을 안하면 getClass().getName()에서 String이나 Integer가 아니라 Object가 나온다.

간단한 예시지만 사용할 때 형변환을 엄청 해야 한다.

할게 추가된다 = 실수 할 것이 많아진다.

제네릭은 이런 부분을 좀 편하게 하기 위해 만들어졌다.


제네릭을 어떻게 쓰는가?

T를 추가한다. T는 Type를 뜻하는듯.

다양한 타입이 들어온다느 느낌으로 생각하면 편하겠다.