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

홍석현님의 프로필 이미지
홍석현

작성한 질문수

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

직접 구현하는 배열 리스트5 - 제네릭2

직접 구현 하는 컬렉션 코드는 실제 내부 구현과 유사하게 구현하시는건가요?

작성

·

289

·

수정됨

0

[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예/)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)

[질문 내용]
직접 구현 하는 컬렉션 코드는 실제 내부 구현과 유사하게 구현하시는건가요?

예를 들면 배열 리스트에서 capacity를 넘어서 데이터를 추가 시에 기존 배열의 50% 정도 증가하는 방법을 사용한다고 pdf에 나와있는데 이런 부분들이 실제 구현과 같은지 궁금합니다.

답변 1

0

안녕하세요. 홍석현님, 공식 서포터즈 y2gcoder입니다.

네 맞습니다. 영한님께서는 보통 실제 프레임워크의 코드 중 핵심 원리 코드는 그대로 구현하고자 하시고, 나머지 성능 최적화를 위한 코드들은 생략하는 방식으로 간소화하여 코드를 작성하시고 저희에게 원리를 설명하는데 집중하는 방식으로 강의하시는 스타일이십니다!

강의에서도 말씀하시듯이 직접 구현하는 코드는 2배씩 배열의 길이를 확장했지만, 실제 ArrayList의 구현 코드는 배열의 길이를 50%정도 늘리게 됩니다.

image심지어 실제 구현 코드와 메서드 이름도 똑같이 만드셨기 때문에 ArrayList를 찾아서 들어가면

image이렇게

int newCapacity = ArraysSupport.newLength(oldCapacity,
                    minCapacity - oldCapacity, /* minimum growth */
                    oldCapacity >> 1           /* preferred growth */);

해당 코드를 볼 수 있습니다.

첫번째 인자는 기존 배열의 크기,
두번째 인자는 최소로 늘릴 크기(아래의 private Object[] grow() 를 보시면 원래 길이 + 1 을 minCapacity로 사용하게 됩니다. 그래서 두번째에 들어갈 인자의 값은 1 이 됩니다!
세번째 인자로는 비트 연산을 통해 원래 배열의 길이의 50% 값을 구하는 것을 볼 수 있습니다.

그래서 해당 메서드 구현을 따라가보면 (ArraySupport.java)

image기존 배열의 길이 + (최소 증가 길이(==1), 50% 증가 길이 중 최댓값)으로 새 배열 길이를 반환해주는 것을 보실 수 있습니다.

그리고 다시 ArrayList를 보시면 반환받은 새 길이의 배열을 만들고 기존 값을 복사해서 넣어주는 것을 보실 수 있습니다!

 

감사합니다.

홍석현님의 프로필 이미지
홍석현
질문자

답변 감사합니다

홍석현님의 프로필 이미지
홍석현

작성한 질문수

질문하기