Java
Java Generics에서 extends와 super의 차이점
Wanderer Kim
2025. 5. 6. 20:50
728x90
Generics를 공부하면서 extends와 super가 헷갈려서 두 keyword의 정의와 차이점을 정리해 보았다.
extends란?
generics에서 extends keyword는 타입의 상한 경계를 제한할 때 사용됩니다.
- T 타입과 T의 하위 클래스 타입만 허용합니다.
- 사용 예시: List<? extends Number>는 Number와 Integer,Double등 Number의 하위 타입만 받을 수 있습니다..
- 주로 읽기 용도로 사용합니다. 리스트에서 값을 꺼낼 때 타입 안정성을 보장할 수 있지만 리스트에 값을 추가할 때는 타입 불일치로 인해 제한됩니다
public void printNumbers(List<? extends Number> list) {
for (Number n : list) {
System.out.println(n);
}
// list.add(1); // 컴파일 에러 발생!
}
super란?
generics에서 super keyword는 타입의 하한 경계를 제한할 때 사용합니다.
- T 타입과 T의 상위 클래스만 허용합니다.
- 사용 예시: List<? super Integer>는 List<Integer>, List<Number>, List<Object>등 Integer의 상위 클래스만 받습니다.
- 주로 쓰기(write) 용도로 사용합니다. 리스트에 T 타입이나 그 하위 타입의 객체를 안전하게 추가할 수 있습니다. 하지만 리스트에서 값을 꺼낼 때는 Object로만 안전하게 꺼낼 수 있습니다.
public void addIntegers(List<? super Integer> list) {
list.add(1); // OK
// Integer n = list.get(0); // 컴파일 에러! Object로만 안전하게 꺼낼 수 있음
}
결론
- extends: 상한 경계, 하위 타입만 허용, 읽기 전용에 적합
- super: 하한 경계, 상위 타입만 허용, 쓰기 전용에 적합
반응형