Languages/Java

[JAVA]ArrayList의 동작 및 내부 구현

MoonSta 2023. 1. 13. 11:26

2022.11.30 - [JAVA] - [JAVA] 콜렉션이란?

 

[JAVA] 콜렉션이란?

JAVA의 컬렉션(collection>이란 데이터의 집합을 의미하며 컬렉션 프레임워크(collection framework)란 다수의 데이터를 쉽고과적으로 처리할 수 있는 표준화된방법을 제공하는 클래스의 집합을 의미한다

mooonstar.tistory.com

2023.01.07 - [JAVA] - [JAVA]LinkedList와 ArrayList

 

[JAVA]LinkedList와 ArrayList

LinkedList와 ArrayList 2022.11.30 - [JAVA] - [JAVA] 콜렉션이란? [JAVA] 콜렉션이란? JAVA의 컬렉션(collection>이란 데이터의 집합을 의미하며 컬렉션 프레임워크(collection framework)란 다수의 데이터를 쉽고과적으

mooonstar.tistory.com

ArrayList : 

 이전의 포스팅에서는 컬렉션 프레임워크의 하나인 List와 List의 구현 클래스 ArrayList와 LinkList에 차이에 대해 알아보았습니다. 이번 시간에는 ArrayList에 대해 좀 더 자세하게 알아보고 직접 내부 구현을 해보도록 하겠습니다. 

 

Array의 문제와 ArrayList의 등장

 기존의 Array는 여러 개의 데이터를 하나의 그룹 안에 넣고 관리하기 위해 등장한 자료 구조로 연속된 메모리에 요소들이 연속적으로 존재합니다. 또한 각각의 요소들은 중복되지 않은 index를 가지고 있으며 이 index를 가지고 개별적인 요소에 접근할 수 있습니다. 

 

index
0
1 2 3 4 5
element
3
5 7 1 2 5

 위의 배열 구조를 보면 요소별로 index, element가 쌍을 이루고 있는 모습을 확인할 수 있습니다. 하지만 이러한 Array에는 큰 단점이 있습니다. 바로 Array의 크기는 처음 선언될 때 지정이 되고 값을 바꿀 수 없습니다. 그러므로 요소의 추가 및 삭제가 일어나면 생기는 문제가 발생합니다. 우선 Array 크기보다 더 많은 요소를 넣을 수 없으며, 삭제 시에는 삭제된 상태로 메모리에 남아 메모리의 낭비가 발생하기 때문에 이러한 단점을 극복하기 위해 ArrayList가 등장하였습니다.

 

ArrayList 직접 구현

 ArrayList의 대한 설명은 이전 포스팅에서 다루었기 때문에 바로 내부 구현을 해보도록 하겠습니다. 

 

Main 클래스

public class Main {
    public static void main(String[] args) {
        //ArrayList 객체 생성
        ArrayList moonstar = new ArrayList();
    }
}

메인 클래스의 ArrayList 객체를 생성하였습니다. 이제 ArrayList 클래스를 구현하겠습니다.

 

ArrayList 클래스

public class ArrayList {
    //요소의 개수를 사용하기 위한 변수
    private int size = 0;
    //내부적으로 사용할 배열 선언
    private Object[] element = new Object[100];
    
    //메서드 구현부
    
}

ArrayList 클래스를 생성하고, 내부적으로 사용할 변수와 배열을 만들었습니다. main 클래스에서 사용할 메서드를 만들어보도록 하겠습니다. 

ArrayList - add() 구현

add() 동작 방식

1. index 2, 3 사이에 새로운 데이터 추가 시

2 5 12 1 79 11

2 index 3부터 뒤로 이동

2 5   12 1 79 11

3. 데이터 추가

2 5 NEW 12 1 79 11

 

add() 구현

public class ArrayList {
    //요소의 개수를 사용하기 위한 변수
    private int size = 0;
    //내부적으로 사용할 배열 선언
    private Object[] element = new Object[100]; 
    
    //add 메서드
    public boolean add(int index, Object element) {
        //Array의 뒤에서 부터 루프
        for(int i = size - 1; i >= index; i--) { 
            //해당 인덱스까지 뒤로 이동
            element[i + 1] = element[i]; 
        }
        //빈 곳에 element 삽입
        element[index] = element; // 비어있는 인덱스에 넣고싶었던 값을 넣는다. 
        size++;   
        return true;
    }    
}

ArrayList - remove() 구현

remove() 동작 방식

1. index = 2인 element 삭제 시

2 5 1 7 8 2

2.삭제

2 5 X 7 8 2

3. 삭제된 index 뒤에 요소들 한 칸씩 앞으로 이동

2 5 7 8 2

 

remove() 구현

public class ArrayList {
    //요소의 개수를 사용하기 위한 변수
    private int size = 0;
    //내부적으로 사용할 배열 선언
    private Object[] element = new Object[100];
    
    //메서드 구현부
    public Object remove(int index) { 
        //삭제할 요소 저장
        Object removed = element[index]; 
        //삭제된 요수 뒤의 요소들을 한칸씩 앞으로 이동
        for(int i = index + 1; i <= size-1; i++) { 
            element[i-1] = element[i];
        }
        //사이즈 축소 
        size--; 
        //메모리의 낭비를 막기 위해 마지막 element 삭제
        element[size] = null; 
        //삭제된 요소 리턴
        return removed; 
    }
}

💥 정리

 ArrayList를 직접 구현하여 사용해보았다. 물론 ArrayList의 더 많은 메서드가 있지만 이번 포스팅에서는 시간상 add(), remove()만 구현을 해보았습니다. 이 글을 보시는 분들은 추가로 학습을 위해 개인적으로 구현해보는 게 좋을 것 같습니다!! 

 

감사합니다!