컴퓨터/자료구조
ArrayList의 add(T t)와 addAll(Collection<? extends T> collection)을 구현해보자.
gracelove91
2019. 10. 9. 14:03
먼저 MyArrayList
는 변수로 int size
와 private T[] array
를 가지고 있다.
클래스의 선언부와 변수.
public class MyArrayList<T> implements List<T> { int size; private T[] array;
size
는 실제 데이터가 저장된 갯수다. 따라서add()
를 호출할 때 값이 하나씩 늘어난다.array.length
와는 차이가 있다.생성자
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이다.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++
를 해주고size
가array.length
와 같거나 크다면size
에 * 2를 해준 새로운 배열을 만들어서array
가 가리키게 한다. 마지막으로 마지막 데이터가 위치한 그 다음 인덱스에 인자값으로 들어온 객체를 위치시켜준다.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 메소드의 인자값으로 요소들을 넣어준다.