Closed cheewr85 closed 2 years ago
public class HeapPollutionEx {
public static void main(String[] args) {
List<String> strings1 = Arrays.asList("첫 요소");
List<String> strings2 = Arrays.asList("첫 요소");
doSomthing(strings1, strings2);
}
private static void doSomthing(List<String> ... stringLists) {
List<Integer> intList = Arrays.asList(42);
Object[] objects = stringLists;
objects[0] = intList; // 힙 오염 발생
String s = stringLists[0].get(0); // ClassCastException
}
}
위의 예시가 힙 오염의 사례라고 볼 수 있음
제네릭과 매개변수화 타입은 실체화 되지 않는 실체화 불가 타입인데 이 실체화 불가 타입은 런타임에 컴파일타임보다 타입 관련 정보를 적게 담고 있는 것을 말함
doSomething
메서드의 인자로 들어온 가변 인자는 List<String>
배열인데 Object[]
배열 변수로 가변인자를 초기화학고 인덱스 0의 요소를 List<Integer>
타입의 변수로 초기화함
이 때 힙오염이 발생하는데 이 말은 해당 배열에 다른 타입이 두 가지가 존재함을 의미함
이런 상황을 힙오염 상황이라고 볼 수 있음
[질문]
173pg
배열의 런타임 타입이 컴파일타임 타입과 달라 힙 오염을 일으킨다고 하였는데, 이를 좀 더 구체적으로 알아보면?