리스트 인터페이스 확인하기
```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