컴퓨터/자료구조

ArrayList의 add(T t)와 addAll(Collection<? extends T> collection)을 구현해보자.

gracelove91 2019. 10. 9. 14:03

먼저 MyArrayList는 변수로 int sizeprivate T[] array를 가지고 있다.

  1. 클래스의 선언부와 변수.

    public class MyArrayList<T> implements List<T> {
     int size;
     private T[] array;

    size는 실제 데이터가 저장된 갯수다. 따라서 add()를 호출할 때 값이 하나씩 늘어난다. array.length와는 차이가 있다.

  2. 생성자

    public MyArrayList() {
     array = (T[])new Object[10];
     size = 0;
    }

    new 연산자를 이용해 객체를 생성하게되면 들어간 데이터가 아무 것도 없을테니 size는 0으로 초기화해주고,
    legnth가 10인 Object타입 배열을 만들어 준 뒤 제네릭타입으로 형변환 해준다.

    제네릭타입으로 배열을 생성하는 건 안된다. new T[10] X
    내부의 array.legnth는 10이고, 겉으로 드러난 MyArrayList.size는 0이다.

  3. add(T t)

    @Override
     public boolean add(T t) {
         size++;
         if(size >= this.array.length) {
             this.array = Arrays.copyOf(this.array, this.size * 2);
         }
         array[size-1] = t; //첫번째 데이터를 집어넣었다면 데이터가 위치한 인덱스는 0이고, size는 1이기 떄문에 -1
         return true;
     }

    add(T t)를 호출하게 되면 size++를 해주고 sizearray.length와 같거나 크다면 size에 * 2를 해준 새로운 배열을 만들어서 array가 가리키게 한다. 마지막으로 마지막 데이터가 위치한 그 다음 인덱스에 인자값으로 들어온 객체를 위치시켜준다.

  4. addAll(Collection<? extends T> c)

    @Override
     public boolean addAll(Collection<? extends T> c) {
         //c를 배열로 변환하고, size에 c의 사이즈만큼 += 해주고, this.array에 요소를 추가한다.
         for(T willAdd : c) {
             add(willAdd);
         }
         return true;
     }

    향상된 for문을 이용해 이미 구현한 add 메소드의 인자값으로 요소들을 넣어준다.