작성
·
289
·
수정됨
답변 1
0
안녕하세요. 홍석현님, 공식 서포터즈 y2gcoder입니다.
네 맞습니다. 영한님께서는 보통 실제 프레임워크의 코드 중 핵심 원리 코드는 그대로 구현하고자 하시고, 나머지 성능 최적화를 위한 코드들은 생략하는 방식으로 간소화하여 코드를 작성하시고 저희에게 원리를 설명하는데 집중하는 방식으로 강의하시는 스타일이십니다!
강의에서도 말씀하시듯이 직접 구현하는 코드는 2배씩 배열의 길이를 확장했지만, 실제 ArrayList의 구현 코드는 배열의 길이를 50%정도 늘리게 됩니다.
심지어 실제 구현 코드와 메서드 이름도 똑같이 만드셨기 때문에 ArrayList를 찾아서 들어가면
이렇게
int newCapacity = ArraysSupport.newLength(oldCapacity,
minCapacity - oldCapacity, /* minimum growth */
oldCapacity >> 1 /* preferred growth */);
해당 코드를 볼 수 있습니다.
첫번째 인자는 기존 배열의 크기,
두번째 인자는 최소로 늘릴 크기(아래의 private Object[] grow()
를 보시면 원래 길이 + 1 을 minCapacity로 사용하게 됩니다. 그래서 두번째에 들어갈 인자의 값은 1 이 됩니다!
세번째 인자로는 비트 연산을 통해 원래 배열의 길이의 50% 값을 구하는 것을 볼 수 있습니다.
그래서 해당 메서드 구현을 따라가보면 (ArraySupport.java)
기존 배열의 길이 + (최소 증가 길이(==1), 50% 증가 길이 중 최댓값)으로 새 배열 길이를 반환해주는 것을 보실 수 있습니다.
그리고 다시 ArrayList를 보시면 반환받은 새 길이의 배열을 만들고 기존 값을 복사해서 넣어주는 것을 보실 수 있습니다!
감사합니다.
답변 감사합니다