제네릭은 클래스, 인터페이스, 메서드 등에서 사용할 데이터 타입을 외부에서 지정하는 기법입니다. 어떤 타입이든 받을 수 있지만, 컴파일 시점에 타입을 명확하게 제한할 수 있습니다.
class GenericBox<T> { // T: 타입 매개변수
private T item;
public GenericBox(T item) {
this.item = item;
}
public T getItem() {
return item;
}
}
public <T> void printArray(T[] array) {
// String 배열이든, Integer 배열이든 어떤 타입의 배열이든지 받겠다는 의미
for (T element : array) {
System.out.println(element);
}
}
위 예시에서 List<?>를 보여주었는데 List<T>와 무슨 차이가 있나요?
T는 타입을 명확하게 지정하겠다는 의미, ?는 알 수 없는 임의의 타입도 허용하겠다는 의미입니다.
즉, T를 사용하는 것은 타입을 알고 있고, T에 대한 연산을 할 수 있지만, ?를 사용하는 것은 타입을 모르기 때문에 Object로만 다룰 수 있고, 타입 안정성에 의해서 관련된 메서드들을 사용할 수 없습니다.보통 와일드카드(?)는 읽기 전용과 같은 방식으로 객체를 다루고 싶을 때 사용합니다.
자료 및 코드 출처: 스파르타 코딩클럽