MyArrayList.java
import java.util.ArrayList;
public class MyArrayList {
//
// -- Fields Area --
//
// 기능을 참고하기 위한 샘플
private ArrayList<Integer> sample =
new ArrayList<Integer>();
// final: 최종
private final int DEFAULT_LEN = 3;
private int arr[] = null;
private int curIdx = 0; // 현재 데이터가 들어갈 인덱스
private int length = 0;
//
// -- Constructor Area --
//
public MyArrayList() {
// 생성시 크기가 지정되지 않으면 기본 크기로 생성
length = DEFAULT_LEN;
arr = new int[length];
}
public MyArrayList(int _len) {
// 만약에 길이가 1 보다 작은 수가 들어왔다면 기본 크기로 생성
if (_len < 1) _len = DEFAULT_LEN;
// 생성시 크기가 지정되면 지정된 크기만큼 생성
length = _len;
arr = new int[length];
}
//
// -- Public Area --
//
public void add(int _val) {
//sample.add();
// 1. 데이터를 추가하러 왔을 때 공간이 모자르니 추가
// 현재 배열이 가득 찼는지 검사
if (checkFull()) arrayExtend();
//arr[curIdx] = _val;
//++curIdx;
setValueWithIndex(curIdx, _val);
// 2. 인덱스를 증가시키고 보니 공간이 모자르니 추가
}
public void add(int _idx, int _val) {
// _idx 예외처리
// 1. 인덱스는 0 보다 작으면 안됨
if (_idx < 0) return;
// 2. 인덱스가 배열의 길이를 벗어나면 안됨
if (_idx >= length) return;
// 3. 인덱스가 curIdx를 벗어나면 안됨
if (_idx > curIdx) return;
// [10, 20, 30, 40, 50] 5/5
// add(1, 100);
// [10, ' ', 20, 30, 40, 50]
// [10, 100, 20, 30, 40, 50] 6/10
if (checkFull()) arrayExtend();
int tmpIdx = curIdx;
while(tmpIdx > _idx) {
arr[tmpIdx] = arr[tmpIdx - 1];
--tmpIdx;
}
//arr[_idx] = _val;
//++curIdx;
setValueWithIndex(_idx, _val);
}
public int removeWithIndex(int _idx) {
//sample.remove
// 1. 인덱스가 0 보다 작으면 안됨
// -1: Error code
if (_idx < 0) return -1;
// 2. 인덱스가 curIdx 보다 작아야 됨
if (_idx >= curIdx) return -1;
// 3. curIdx가 0이면 데이터가 없음
if (checkEmpty()) return -1;
// 데이터가 지워지기 전에 따로 저장
// -> 반환해줘야 하기 때문
int delData = arr[_idx];
int tmpIdx = _idx + 1;
while (tmpIdx <= curIdx) {
arr[tmpIdx - 1] = arr[tmpIdx];
++tmpIdx;
}
// 하나가 지워졌으니 현재 인덱스 줄이기
--curIdx;
return delData;
}
// 1. 전달된 값이 존재하면 제거 -> true 반환
// 2. 전달된 값이 없으면 종료 -> false 반환
public boolean removeWithValue(int _val) {
for (int i = 0; i < curIdx; ++i) {
if (arr[i] == _val) {
removeWithIndex(i);
return true;
}
}
return false;
}
public void clear() {
curIdx = 0;
}
public boolean contains(int _val) {
for (int i = 0; i < curIdx; ++i) {
if (arr[i] == _val) return true;
}
return false;
}
public void printAll() {
System.out.println(
"-- " + curIdx + " / " + length + " --");
for (int i = 0; i < curIdx; ++i) {
System.out.println(i + ": " + arr[i]);
}
}
public boolean checkEmpty() {
return curIdx == 0;
}
//
// -- Private Area --
//
private boolean checkFull() {
return curIdx >= length;
}
// 배열의 길이를 두 배로 확장
private void arrayExtend() {
// 배열 늘리기
// 길이를 2배로 늘림
length *= 2;
// 길이가 2배로 늘어난 새로운 배열 생성
int newArr[] = new int[length];
// 원래 배열에서 데이터 복사
int i = 0;
for (int val : arr) {
newArr[i] = val;
++i;
}
// 새로운 배열을 클래스가 관리할 배열로 지정
arr = newArr;
}
private void setValueWithIndex(int _idx, int _val) {
arr[_idx] = _val;
++curIdx;
}
} // MyArrayList
Main.java
public class Main {
public static void main(String[] _args) {
MyArrayList arrList = new MyArrayList(2);
arrList.add(10);
arrList.add(20);
arrList.printAll();
arrList.add(30);
arrList.add(40);
arrList.add(1, 50);
arrList.printAll();
arrList.removeWithValue(50);
arrList.printAll();
}
}