## 과제 : 인터페이스를 사용하여 ArrayList와 LinkedList 추상화하기 목표 : `MyList<T>`라는 이름의 인터페이스를 만들어 이전에 작성한 `MyArrayList`와 `MyLinkedList` 두 클래스를 추상화한다. 요구사항 : 다음 요구사항을 만족하는 `MyList` 인터페이스를 구현하고, `MyArrayList`와 `MyLinkedList` 두 클래스가 이 인터페이스를 상속받아 동작했을 때 문제 없이 돌아가도록한다. - `MyList<T>`는 다음과 같은 추상 메서드를 가지고 있다. - `void add(T data)`: 리스트의 끝에 새로운 요소를 추가한다. - `void remove(int index)`: 지정된 인덱스의 요소를 삭제하고, 삭제된 요소의 데이터를 반환한다. - `T get(int index)`: 지정된 인덱스의 요소 데이터를 반환한다. - `int size()`: 리스트의 크기(요소 수)를 반환한다. ## 과제 : 인터페이스를 사용하여 ArrayList와 LinkedList 추상화하기 모범답안 ```java public interface MyList<T> { void add(T data); void remove(int index); T get(int index); int size(); } ``` ```java public class MyArrayList<T> implements MyList<T> { private T[] array; private int size; public MyArrayList() { array = (T[]) new Object[10]; size = 0; } @Override public void add(T value) { if (size >= array.length) { T[] newArray = (T[]) new Object[array.length * 2]; System.arraycopy(array, 0, newArray, 0, array.length); array = newArray; } array[size++] = value; } @Override public T get(int index) { return array[index]; } @Override public int size() { return size; } @Override public void remove(int index) { System.arraycopy(array, index + 1, array, index, size - index - 1); size--; } } ``` ```java public class MyLinkedList<T> implements MyList<T> { public static class Node<T> { T data; Node<T> next; public Node(T data) { this.data = data; } } private Node<T> head; private int size; @Override public void add(T value) { Node newNode = new Node(value); if (head == null) { head = newNode; } else { Node last = head; while (last.next != null) { last = last.next; } last.next = newNode; } size++; } @Override public T get(int index) { Node<T> node = head; for (int i = 0; i < index; i++) { node = node.next; } return node.data; } @Override public int size() { return size; } @Override public void remove(int index) { if (index == 0) { head = head.next; } else { Node<T> node = head; for (int i = 0; i < index - 1; i++) { node = node.next; } node.next = node.next.next; } size--; } } ```