3 minute read


리스트 인터페이스 확인하기 ```java /** * * @author andpact * @param the type of newEs it this list * */ public interface List { /** * 지정된 인덱스에 지정된 요소를 삽입합니다. * @param index 요소를 삽입할 인덱스 * @param newE 삽입할 요소 */ void add(int index, E newE); /** * 지정된 인덱스의 요소를 반환합니다. * @param i 반환할 요소의 인덱스 * @return 반환할 요소 */ E get(int i); // UPDATE /** * 지정한 위치의 요소를 지정한 요소로 교체합니다. * @param i 변경될 요소의 인덱스 * @param e 새로운 요소 */ void set(int i, E e); /** * 지정한 인덱스의 요소를 제거합니다. * @param index 삭제할 요소의 인덱스 */ void remove(int index); /** * 첫 요소부터 탐색하여 지정한 요소가 존재한다면 해당 요소를 삭제합니다. * @param e 삭제할 요소 */ void remove(E e); /** * 모든 요소를 삭제합니다. */ void clear(); /** * 지정한 요소를 포함하고 있다면 true를 반환합니다. * @param o 포함 여부를 확인할 객체 * @return 지정된 객체를 포함하고 있다면 true를 반환 */ boolean contains(Object o); /** * 지정된 요소의 인덱스를 반환합니다. 없다면 -1을 반환합니다. * @param o 인덱스를 확인할 요소 * @return 지정된 객체가 존재한다면 해당 객체의 인덱스 반환, 그렇지 않으면 -1 반환 */ int indexOf(Object o); /** * 요소를 포함하고 있지 않다면 true를 반환합니다. * @return 요소를 포함하고 있지 않다면 true 반환 */ boolean isEmpty(); /** * 요소의 개수를 반홥합니다. * @return 요소의 개수 반환 */ int size(); } ``` </details>

## **생성자** ```java public class ArrayList implements List { private static final int DEFAULT_CAPACITY = 10; // 기본 배열 크기 private E[] arr; // 요소를 담을 배열 private int size; // 요소의 수 public ArrayList() { // 기본 배열 크기의 배열 리스트 생성자 this.arr = (E[]) new Object[DEFAULT_CAPACITY]; this.size = 0; } public ArrayList(int capacity) { // 지정된 크기의 배열 리스트 생성자 this.arr = (E[]) new Object[capacity]; this.size = 0; } } ``` ## **CREATE 메서드** ```java @Override public void add(int index, E newE) { if (index < 0 || size <= index) // 인덱스가 배열 리스트의 범위를 벗어난 경우 throw new IndexOutOfBoundsException(); else if (size == arr.length) resize(); // 데이터가 가득 찬 경우 크기 조정 for (int i = size - 1; index <= i; i--) arr[i + 1] = arr[i]; arr[index] = newE; size++; } ``` ## **READ 메서드** ```java @Override public E get(int i) { if (i < 0 || size <= i) // 인덱스가 배열 리스트의 범위를 벗어난 경우 throw new IndexOutOfBoundsException(); return arr[i]; } ``` ## **UPDATE 메서드** ```java @Override public void set(int i, E newE) { if (i < 0 || size <= i) // 인덱스가 배열 리스트의 범위를 벗어난 경우 throw new IndexOutOfBoundsException(); arr[i] = newE; } ``` ## **DELETE 메서드** ```java @Override public void remove(int index) { // 인덱스를 이용한 데이터 제거 if (index < 0 || size <= index) // 인덱스가 배열 리스트의 범위를 벗어난 경우 throw new IndexOutOfBoundsException(); for (int i = index; i < size - 2; i++) arr[i] = arr[i + 1]; arr[size - 1] = null; size--; resize(); // 데이터 제거 후 배열 리스트 크기 조정 } @Override public void remove(E e) { // 요소를 이용한 데이터 제거 int index = indexOf(e); remove(index); } @Override public void clear() { // 전체 데이터 제거 arr = (E[]) new Object[arr.length]; size = 0; resize(); // 데이터 제거 후 배열 리스트 크기 조정 } ``` ## **기타 메서드** ```java @Override public int indexOf(Object o) { for (int i = 0; i < size - 1; i++) if (arr[i].equals(o)) return i; return -1; // 찾으려는 요소가 없는 경우 } @Override public boolean contains(Object o) { return indexOf(o) != -1; } @Override public boolean isEmpty() { return size == 0; } @Override public int size() { return size; } public void resize() { if (size == 0) // 요소를 전부 제거된 경우 arr = (E[]) new Object[DEFAULT_CAPACITY]; else if (size == arr.length) // 배열 리스트가 가득 찬 경우 arr = Arrays.copyOf(arr, arr.length * 2); else if (size < arr.length / 2) // 요소의 수가 배열 리스트 크기의 절반이 안되는 경우 arr = Arrays.copyOf(arr, Math.max(DEFAULT_CAPACITY, arr.length / 2)); } ```

Leave a comment