BackEnd/JAVA

6. MyArrayList

BlancPong 2022. 2. 23. 16:19
728x90
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();
    }
}