핵심 정리: 용어 정리

• 로 타입: List

• 제네릭 타입: List<E>

• 매개변수화 타입: List<String>

• 타입 매개변수: E

• 실제 타입 매개변수: String

• 한정적 타입 매개변수: List<E extends Number>

• 비한정적 와일드카드 타입: Class<?>

• 한정적 와일드카드 타입: Class<? extends Annotation>

public class GenericBasic {

    public static void main(String[] args) {
        // Generic 사용하기 전 - row anti pattern 
        List numbers = new ArrayList();
        numbers.add(10);
        numbers.add("whiteship");

        for (Object number: numbers) {
            System.out.println((Integer)number);
        }

        // Generic 등장 이후
        List<Integer> nuberms = new ArrayList<>();
        nuberms.add(10);
        nuberms.add("whiteship");

        for (Integer number: nuberms) {
            System.out.println(number);
        }
    }
}

---

public class Box<E> {

    private E item;

    private void add(E e) {
        this.item = e;
    }

    private E get() {
        return this.item;
    }

    public static void main(String[] args) {
        Box<Integer> box = new Box<>();
        box.add(10);
        System.out.println(box.get() * 100);

        printBox(box);
    }

    **private static void printBox(Box<?> box)** { // 안전한 코드 
        System.out.println(box.get());
    }

}

핵심 정리: 매개변수화 타입을 사용해야 하는 이유

런타임이 아닌 컴파일 타임에 문제를 찾을 수 있다. (안정성)

제네릭을 활용하면 이 정보가 주석이 아닌 타입 선언 자체에 녹아든다. (표현력)

“로 타입”을 사용하면 안정성과 표현력을 잃는다.

그렇다면 자바는 “로 타입”을 왜 지원하는가?

List와 List<Object>의 차이는?

Set과 Set<?>의 차이는?