우선 제네릭의 용도와 와일드 카드를 비교하며 차이를 서술
와일드 카드의 용도 + 제네릭에 대한 자세한 사용법
후에 다음 제네릭 2편에서 서술

Generic 의 용도
다양한 타입을 파라미터로 받아 클래스, 메서드에서 지정하고
그 타입을 고정하여 처리를 하게 하는 것
Wild Card와 비교
제네릭
다양한 타입 정보를 활용하려고 사용하는 것, 받은 하나의 타입으로 고정해서!
그냥 타입을 고정해서 사용하면 되는 것 아닌가?
당연히 그렇게 사용가능하는게 깔끔하고 반복적이지 않으면 그게 맞음
하지만 당연히 모든 언어에서 신규 추가는
반복적인 요소들을 줄이기 위해 태어난 것임을 알아두어야함 (재사용성)
// 다양한 타입을 처리하기 위해 동일한 로직이 담긴 클래스를 계속 만들것인가? class StringProcessing { private String value; .... } class IntegerProcessing { private Integer value; .... } class DoubleProcessing { private Double value; .... } // 타입 추가 될때 마다 무한 반복 작성... // 제네릭을 사용하면 아래 하나 클래스로 모든 걸 처리 가능 하게 구성 가능 class TypeProcessing<T> { private T value; .... }
와일드 카드
타입을 모르고 사용하는 것
리턴이 불가
메서드의 매개변수나 변수 타입에서만 사용함, 이 타입은 모르고 사용함
왜 나온건가?
제네릭의 엄격한 사용 덕분에 만들어짐
Object obj = "String"; // String은 Object의 자식 -> 가능 List<Object> list = new ArrayList<String>(); -> 안됨!에러의 이유 → 제네릭을 활용해서 사용할 때 타입의 보장이 없음
타입 파라미터가 <Object> 니까 <String>도 되야하지 않을까?
list.add(123123); list.add(new food()); // 위와 같은 추가사항에 대해서도 허용을 해야하는 상황이 옴 // (Object는 최상위 클래스니까) // 근데 list는 ArrayList<String> 인데..? -> 에러이러한 오류를 막기 위해 제네릭은 허용하지 않음
이를 불공변이라고 함
근데 배열은 이게 가능함 → 공변
Object[] objArr = new String[10]; // 컴파일 에러 없음 objArr[0] = 123; // 컴파일 에러 없음 // 런타임시 에러 발생함 (ArrayStoreException)초창기 설계로 다형성을 위해서는
배열에 Object에 담고 사용할 수 밖에 없었고
매번 꺼내서 캐스팅해서 쓰는 사례로 유지될 수 밖에 없었다 함제네릭으로 배열로 인한 공변 설계 오류를
놓치지 않았고 후에 런타임 에러화로 수정되었다고 함
💡
Share article