PS/Data Structure

ArrayList 구현 방법 (MyArrayList)

chaerlo127 2022. 4. 10. 00:55
728x90

ArrayList를 직접 코드를 구현하여 int 형 ArrayList를 나타내 보고자 한다.

✨  Constructor & Basic Attribute

private int[] elementData; // 값 넣을 곳
private int size; // arraylist size
private int currentCapacity; // 현재 arraylist 크기
private int initCapacity = 10; // 최초 arraylist 크기

//constructor
public MyArrayList() {
    this.elementData = new int[initCapacity];
    this.size = 0;
    this.currentCapacity = initCapacity;
}

값 넣을 elementData를 최초로는 10의 값을 넣어주고, size는 0, 현재 arraylist size(currentCapacity)는 최초 arraylist 크기로 초기화 시킨다. 

 


✨  add

1. addFrist (int data)

2. addLast (int data)

3. add(int index, int data)

public boolean addFirst(int data) {
    return add(0, data);
}

public boolean addLast(int data) {
    changeCapacity();
    elementData[size]= data;
    size++;
    return true;		
}

public boolean add(int index, int data) {
    changeCapacity();
    for (int i = size - 1; i >= index; i--) {
        elementData[i + 1] = elementData[i];
    }

    elementData[index] = data;
    size++;
    return true;	
}
	


//refactoring
private void changeCapacity() {
    if(size == currentCapacity) {
        int[] newArray = new int[currentCapacity*2];
        for(int i = 0; i < size ; i++) {
            newArray[i] = elementData[i];
        }
        elementData = newArray;
        currentCapacity = currentCapacity * 2;
    }
}
  • changeCapacity 함수는 현재 size가 배열의 최대 크기와 같다면 (앞으로 데이터를 넣으면 에러가 뜬다면) 배열의 크기를 두배로 만들어준다. 
  • add(int index, int data)는 elementData size에 (현재 최대 index + 1) 앞 index 데이터를 당겨서 값을 넣어주고, 마지막에 원하는 위치에 데이터 값을 넣어준다. (마지막 배열 index + 1 부터 내려가는 식으로 for문을 작성해야 한다.)
  • add 에서는 parameter index가 0일 때,  index -1을 하면 음수가 되어 에러가 날 수 있기 때문에 i를 size -1로 하고 넣어야 하는 값을 i+1을 한다.
  • addFirst(int data)는 add(int index, int data)를 재사용하여 값을 넣어준다. 
  • addLast(int data)는 배열 마지막에 넣어주는 함수이다. 

✨  toString

 실제 객체 값에 들어 있는 값을 출력하기 위해서는 이 함수를 사용해야 한다.

 즉, 객체를 문자로 출력할 때 필요한 함수이다.

public String toString() {
    String str = "[";
    for (int i = 0; i < size; i++) {
        str += elementData[i];
        if (i < size - 1) {
            str += ", ";
        }
    }
    return str + "]";
}

✨  remove

1. remove (int index)

2. removeFirst()

3. removeLast()

public int remove(int index) {
    int removed = elementData[index]; // removed value return
    for(int i = index+1; i<size; i++) {
        elementData[i-1] = elementData[i];
    }
    elementData[size-1] = 0; // last size data default 0
    size --;
    return removed;
}

public int removeFirst() {
    return remove(0);
}

public int removeLast() {
    return remove(size-1);
}
  • 빈 공간이 생기면 앞으로 전진 배치를 하기 위해 index부터 size -1 까지 값을 넣어주는 for문을 시행해야 한다. 

 


✨  get

public int get(int index) {
    return elementData[index];
}

 

  • 배열에  index로 접근한다는 장점에서 linkedList보다 훨씬 더 빨리 데이터 제공이 가능하다.
  • 어느 위치에 있던 간에 동일한 시간에 데이터를 가져올 수 있음.

✨  size, indexOf

public int size() {
    return size;
}

public int indexOf(int data) {
    for(int i =0; i<size; i++) {
        if(elementData[i] == data) {
            return i;
        }
    }
    return -1;
}
  • size(): List의 size
  • indexOf(int data): data가 들어 있는 index의 값

✨  iterator next, hasNext, previous, hasPrevious

for(int i =0; i<numbers.size(); i++) {
    System.out.println(numbers.get(i));
}

 

이렇게 반복적으로 사용되는 구문은 while과 for를 통해 사용할 수 있지만, iterator를 사용하는 것이 더 좋다.

 

// main.class
MyArrayList.MyListIterator li = numbers.listIterator();

while(li.hasNext()) {
    System.out.println(li.next());
}

while(li.hasPrevious()) {
    System.out.println(li.previous());
}

//MyArrayList.class

//ListIterator 객체 생성
public MyListIterator listIterator() {
return new MyListIterator();
}

class MyListIterator {
    private int nextIndex = 0;

    public int next() {
    //			int returnData = elementData[nextIndex];
    //			nextIndex++;
    //			return returnData;
        return elementData[nextIndex++];
    }

    public boolean hasNext() {
        return nextIndex < size();
    }
    
    public int previous() {
        return elementData[--nextIndex];
    }

    public boolean hasPrevious() {
        return nextIndex > 0;
    }

}

 

 

✨  iterator add, remove

//Main.class
while(li.hasNext()) {
    int number = li.next();
    if(number == 30) {
        li.remove(); // or li.add(int data);
    }
    System.out.println(number);
}

System.out.println(numbers);

//MyArrayList.MyListIterator.class
public void add(int data) {
    MyArrayList.this.add(nextIndex++, data);
}
// 최소한 next(); 한번 호츨 후 remove 실행
public void remove() {
    MyArrayList.this.remove(nextIndex-1); 
    // next() 수행하면 nextIndex 값 1개 plus 되므로 그 전의 값을 얻기 위해 -1 해주기
    nextIndex--;
}

 

 

728x90