타입을 파라미터처럼 넘길 수 있게 하는 기능 (Java5부터 도입됨)
List<String> list = new ArrayList<>();
여기서 String은 타입 파라미터
List는 String 타입 요소들만 담도록 제한됨 → 타입 안전성 보장!
List list = new ArrayList();
list.add("hello");
list.add(123); // 숫자도 들어감
String str = (String) list.get(0); // 형변환 필요
모든 요소가 Object로 처리 → 꺼낼 때 형변환 필요
타입 불일치 시 ClassCastException 발생 위험
List<String> list = new ArrayList<>();
list.add("hello");
// list.add(123); // 컴파일 에러 발생!
String str = list.get(0); // 형변환 불필요
컴파일 시점에 타입 체크 가능
형변환(casting) 필요 없음
코드 재사용성과 가독성 향상
public class Box<T> {
private T value;
public void set(T value) {
this.value = value;
}
public T get() {
return value;
}
}
Box<String> stringBox = new Box<>();
stringBox.set("Hello");
System.out.println(stringBox.get()); // Hello
Box<Integer> intBox = new Box<>();
intBox.set(42);
System.out.println(intBox.get()); // 42
public <T extends Number> void printNumber(T number) {
System.out.println(number);
}
T extends Number: T는 Number 또는 그 하위 클래스만 가능
Integer, Double, Float 등은 OK
String은 에러 발생
public void printList(List<?> list) {
for (Object obj : list) {
System.out.println(obj);
}
}
List<?> : 어떤 타입이든 상관 없는 리스트
? extends Number : Number 하위 타입만 허용
? super Integer : Integer 상위 타입만 허용
와일드카드는 추후 조금 더 자세하게 정리해야할 것 같다.