제네릭은 잘못된 값을 저장소 앞에서 막는다

MyArrayList<Entry>는 공개 API에서 Entry만 받고, Object[]라는 내부 사정과 캐스팅을 경계 안에 가둔다.

caller

완성된 Entry

list.add(entry)

문자열과 시간을 따로 배열에 넣지 않아 인덱스 불일치를 막는다.

compile-time gate

MyArrayList<E>

add(E value)

E는 한 인스턴스의 원소 타입으로 고정된다. 잘못된 타입은 호출 시점의 컴파일 오류가 된다.

implementation boundary

Object[] storage

EntryEntryEntry
addE를 Object 슬롯에 저장
get검사된 캐스팅을 한 지점에 격리
List<Integer>
List<Number>

제네릭은 불변이다. 두 타입을 대입 가능하다고 가정하면 Number 목록에 Double을 쓰는 순간 Integer 목록의 안전성이 깨진다.

핵심record Entry가 저장 타입을 고정한다. 이후 배열을 연결 목록으로 바꿔도 공개 경계는 add(Entry)get(): Entry 방향을 유지한다.