ArrayList 구현하기 with Java

정찬·2023년 5월 6일

자료구조

목록 보기
1/7

Collection 인터페이스를 직접 구현해보자.

  1. 인스턴스 변수와 생성자

ArrayList는 이름 그대로 배열에 요소들을 저장한다.
그래서 배열과 size를 인스턴스 변수로 갖는다.

생성자는 두개가 있는데 뒤에 나올 clone() 함수를 수행하기 위해 복사 생성자를 하나 만들었다.

  1. 예외처리

ArrayList는 배열을 사용하고 그렇기 때문에 인덱싱을 한다.
인덱싱이 필요한 각 연산들을 수행하기 전에 매개변수로 받은 인덱스를 검산하지 않으면 오류가 날 것이다.
그래서 인덱스를 검사하는 함수를 따로 만들었다.

그리고 예외처리를 하면서 궁금했던 게 만약 인덱스로 size를 받는다면?
당연히 get, set, remove와 같이 그 인덱스의 요소가 존재해야 연산을 할 수 있는 함수들은 예외처리를 해줘야 할 것이다.

하지만 add함수는 그러지 않았다.
size보다 큰 index는 똑같이 예외처리를 해줘야 하는게 당연하지만, 만약 size와 index가 같을 경우에는 요소를 넣어도 빈 메모리가 존재하지 않으므로 정상적으로 함수가 수행된다는 것을 발견했다.

  1. size < index
  1. size = index

결론

ArrayList는 배열을 다루는 구현체이다 보니, 인덱싱 오류를 검출해줘야 한다.
그리고 get,set,remove 함수와 다르게 add함수는 index와 size가 같때 정상 작동하므로 오류를 던져줘서는 안된다.

이제 중요 함수들을 살펴보자.

  1. add 함수.

배열을 사용하다 보니 add연산마다 배열에 공간이 있는지 확인하고 만약 없다면 배열의 공간을 늘려줘야 한다. 그건 ensureCapacity 함수에서 수행한다.

그리고 addLast함수와는 다르게 다른 add함수들은 배열의 요소들을 뒤로 하나씩 밀어내는 연산을 추가적으로 수행해야 한다.
그렇기 때문에 삽입, 삭제 연산이 빈번하게 일어난다면 ArrayList를 사용하는 것은 권장되지 않는다.

  1. remove 함수, indexCheck 함수(예외처리)

두번째 remove(Object value) 함수는 ArrayList의 장점을 사용할 수 없는 함수이다. 인덱싱에 아무런 이유가 없기 때문이다.
그래서 요소의 인덱스를 알고 있다면 첫번째 함수를 쓰는것이 좋다.

그리고 처음에 예외처리를 설명하면서 말했듯이 remove, get, set과 같은 함수들은 예외처리가 겹친다. 그래서 indexCheck 함수를 따로 만들었다.

  1. get, set 함수

이름 그대로의 로직을 수행하면 된다. 딱히 헷갈리는 부분이 없으므로 넘어가겠다.

  1. ensureCapacity, toArray 함수

ArrayList에서는 ensureCapacity 함수로 배열의 공간을 늘려주고 trimToSize 함수로 배열의 공간을 줄여준다.

ensureCapacity 함수가 작동하는 방법은 매 연산마다 배열에 공간이 필요하다고 판단하면 정의되어 있는 minCapacity 만큼 배열을 늘려주는 것이다. 나는 그걸 두배로 정했다.

  1. clone, clear, indexOf, LastIndexOf, contains함수

clone 함수는 맨 맨 처음에 만들었던 생성자로 새로운 인스턴스를 리턴한다.
indexOf와 LastIndexOf는 이름 그대로 어디서부터 탐색을 시작하는지의 차이이다. ArrayList의 특성상 인덱스로 탐색을 할 수 있지만 여기서는 요소로 접근을 해야하기 때문에 루프를 돌아 탐색을 해야한다. 또한 배열의 특성상 중복을 허용하므로 인덱스를 찾는 함수가 두개로 나뉜것이다.

그리고 contains가 할 일은 indexOf함수가 똑같이 해낼 수 있다.
그러므로 왜 Collection에서 contains함수를 선언해놨는지 궁금했었는데 조금만 생각해보면 그 이유를 알 수 있었다.

Collection에서는 List뿐만 아니라 Set, Map도 있기 때문이다.
Set은 중복을 허용하지 않는다 인덱싱을 사용하지 않기 때문이다. 그래서 boolean을 리턴하는 contains함수를 선언해놨던 것이다.

profile
25.06.24 ~ inblog에서 velog로 이전

0개의 댓글