인프런 커뮤니티 질문&답변

디와이님의 프로필 이미지
디와이

작성한 질문수

김영한의 실전 자바 - 중급 2편

연결리스트 배열 선언?

해결된 질문

작성

·

314

1

해시 알고리즘6-해시 충돌 구현 파트에서

 

LinkedList<Integer>[] buckets = new LinkedList[CAPACITY];

이런 코드가 등장했는데요. 제가 앞선 강의에서 이런 내용을 놓친 것인지는 잘 모르겠지만...ㅠ

제네릭을 통해 선언하는 것인데

new LinkedList<>()[CAPACITY];

를 하면 안되는 이유가 무엇인가요?

답변 1

2

김영한님의 프로필 이미지
김영한
지식공유자

안녕하세요. 다와이님

자바에서는 제네릭을 사용하여 배열을 직접 생성하는 것이 허용되지 않습니다. 이는 자바의 제네릭 타입 소거(type erasure) 메커니즘과 관련이 있습니다. 제네릭 타입은 컴파일 시점에서만 유효하고 런타임 시점에서는 제거되기 때문에, JVM은 런타임에 제네릭 타입 정보를 알 수 없습니다. 이로 인해 제네릭 타입 배열의 타입 안전성을 보장할 수 없습니다.

 

컴파일러는 배열을 생성할 때 정확한 타입 정보를 알아야 합니다. 그러나 제네릭 타입 정보는 컴파일 시점에만 존재하고, 런타임에는 제거되므로, 제네릭 배열을 생성하면 컴파일러는 타입 안전성을 보장할 수 없습니다. 예를 들어:

LinkedList<Integer>[] array = new LinkedList<Integer>[10];

이 코드는 컴파일되지 않습니다. 왜냐하면 LinkedList<Integer> 배열을 생성하는 동안 컴파일러는 이 배열의 타입 정보를 런타임에 유지할 수 없기 때문입니다. 만약 허용된다면, 다음과 같은 문제가 발생할 수 있습니다

Object[] objArray = new LinkedList<Integer>[10];
objArray[0] = new LinkedList<String>(); // 타입 안전성 위배

// ClassCastException 발생 가능
LinkedList<Integer> list = (LinkedList<Integer>) objArray[0]; 

위 코드는 objArray에 다른 제네릭 타입의 객체를 추가함으로써 타입 안전성을 위배할 수 있고, 잘못된 타입 캐스팅으로 인해 ClassCastException이 발생할 수 있습니다.

이 내용이 이해가 어렵다면 간단히 자바에서는 제네릭을 사용하여 배열을 직접 생성하는 것이 허용되지 않는다고 이해하시면 됩니다 🙂

감사합니다.

디와이님의 프로필 이미지
디와이

작성한 질문수

질문하기