제네릭이란?

제네릭을 사용하는 이유

컴파일 시 강한 타입 체크가 가능하다.

컴파일 시에 미리 타입을 강하게 체크하여 에러를 사전에 방지할 수 있다.

타입 변환(casting)을 제거한다.

제네릭 이전

List list = new ArrayList();
list.add("hello");
String str = (String) list.get(0); // 타입 변환이 필요하다.

제네릭 이후

List<String> list = new ArrayList<String>();
list.add("hello");
String str = list.get(0); // 타입 변환이 필요없다.

제네릭 타입(class<T> interface<T>)

타입을 파라미터로 가지는 클래스와 인터페이스를 생성할 수 있다.

public class 클래스명<T> { ... }
public interface 인터페이스명<T> { ... }

타입 파라미터의 네이밍은 변수명과 동일한 규칙에 따라 작성할 수 있다. 단, 관례적으로 영문 대문자 한글자로 작성한다.

모든 종류의 객체를 저장하면서 타입 변환이 일어나지 않는 마법을 부릴 수 있다.

제네릭 예제

public class Box<T> {
    public T t;

    public T getT() {
        return t;
    }

    public void setT(T t) {
        this.t = t;
    }
}
public class Main {
    public static void main(String[] args) {
        Box<String> stringBox = new Box<>();
        stringBox.setT("문자열");
        String stringBoxT = stringBox.getT();
        System.out.println("stringBoxT = " + stringBoxT); // 저장된 문자열 출력

        Box<Integer> integerBox = new Box<>();
        integerBox.setT(100);
        Integer integerBoxT = integerBox.getT();
        System.out.println("integerBoxT = " + integerBoxT); // 저장된 숫자 출력
    }
}