ArrayList의 Remove 내부 동작

Greenddoovie·2022년 1월 17일
0

자료구조

목록 보기
9/9

코틀린의 ArrayList의 Remove 동작이 어떻게 되는지 궁금해서 찾아보고 작성한 글이다.

우선 Kotlin의 ArrayList는 Java의 ArrayList를 사용하고 있다. 따라서, 자바의 ArrayList를 해부하고 이해한 내용을 글로 담았다.

Java의 remove는 2가지 방법이 존재한다
1) remove(index)
2) remove(object)

Remove(index)

  1. 유효한 인덱스 인지 확인
  2. 지워야할 index의 값 임시 저장
  3. index 값 삭제
    • fastRemove 함수 호출
  4. 임시 저장 값 반환

Remove(object)

  1. object의 index 찾기
  2. fastRemove 함수 호출
  3. remove의 결과 여부 반환

위의 과정을 보면 fast remove함수가 계속 호출되고 있음을 알 수 있다.
결국 fast remove함수가 실제 삭제가 일어나는 곳임을 유추할 수 있다.

fast remove

중간에 값을 삭제하는 경우에 array 배열을 앞으로 한칸씩 옮겨주기 위해 System.arraycopy를 호출하여 array 배열을 바꿔주고 있다.

arraycopy(sourceArr, fromIndexOfSourceArr, destArr, fromIndexOfDestArr, Length)

이후 마지막에 배열의 값을 null로 설정한다.

Array의 값 삭제

사실상 array를 이용할 경우, 값을 삭제한다고 해서 array에 쓰이는 메모리가 할당 해제되는 것이 아니다. array는 여전히 사이즈에 해당하는 크기를 가지고 있다.

따라서 array에서 값을 삭제한다는 의미는 값을 삭제하여 array의 메모리 사용량을 줄인다는 게 아니라,

idx에 존재하는 값을 어레이로부터 삭제하고, array가 연속적임을 보장하게 한다. 라는 의미이다

idx에 존재하는 값을 어레이로부터 삭제하는 방법은 덮어씌우기, 삭제하기 방법이 있다. 삭제는 array의 끝을 삭제한다는 의미이고, 덮어씌우기는 array의 끝이 아닌 부분을 삭제할 때, 해당 부분을 덮어씌운다는 의미이다.

덮어 씌우는 이유는 array 연속적임을 보장하게 하기 위함이다.

profile
기초를 이해하면 세상이 다르게 보인다

0개의 댓글