왜 List<String>은 List<Object>가 될 수 없을까? (제네릭과 와일드카드가 공존하는 이유)
·
언어/Java
🧩 공변(covariant)과 무공변(invariant)이란?먼저 개념부터 짚고 가자.공변이란 String이 Object의 하위 타입이라면,List도 List의 하위 타입으로 간주하는 성질이다.하지만 자바 제네릭은 무공변이다.즉, 타입 인자가 다르면 하위 타입으로 인정하지 않는다.String extends Object // ✅ OKList → List // ❌ No이 때문에 다음 코드도 허용되지 않는다.List list = new ArrayList(); // ❌ 컴파일 에러🔒 왜 제네릭은 무공변으로 설계되었을까?이유는 단 하나, 타입 안정성(type safety) 때문이다.다음처럼 컴파일이 허용된다고 가정해보자.List list = new ArrayList();lis..
제네릭 타입 소거
·
언어/Java
타입 소거 제네릭은 자바 컴파일 단계에서만 사용되고, 컴파일 이후에는 제네릭 정보가 삭제된다. 제네릭에 사용한 타입 매개변수가 모두 사라지는 것이다. 쉽게 이야기하면 컴파일 전인 .java 파일에는 제네릭 타입 매개변수가 존재하지만, 컴파일 이후인 .class 파일에는 제네릭 타입 매개변수가 존재하지 않을 것이다. 타입 매개변수 미제한의 경우 컴파일 전 public class GenericBox { private T value; public void set(T value) { this.value = value; } public T get() { return value; } }...void main() { ..