JAVA ArrayList 개념 및 사용 방법

Noahddd·2024년 10월 23일

JAVA

목록 보기
5/12

공부의 정리 및 복습을 위한 기록입니다.

오늘은 어제에 이어서 Arraylist에 대하여 공부한 내용을 정리 해보려고 한다.

Arraylist는 가장 많이 사용되는 list 인터페이스의 구현 클래스이다. Arrylist는 크기가 고정되어 있지 않고 요소가 추가됨에 따라 크기가 확장되어 데이터를 동적으로 관리할 수 있다.
Arraylist는 생성할 때 값을 주지 않으면 10개의 요소를 저장할 수 있느 크기를 가지며 10개가 넘어가면 자동으로 확장되는 형식을 가지고 있다.
내부 배열의 크기를 확장 또는 축소할 때는 새로운 배열을 만들고, 기존 배열의 내용을 복사하는 형태로 작동한다.

Arraylist는 index를 통해 접근하는 방식이기 때문에
get, set등 특정 index를 통해 실행할때 O(1)의 시간복잡도로 빠르게 요소에 접근할 수 있으며, add() 메서드를 이용하여 다음과 같다.

위와 같이 인덱스를 이용하여 중간에 요소를 삽입하는 경우
3번 인덱스 자리에 삽입이 되고 기존 3번 인덱스부터 마지막 인덱스까지는 한 자리가 밀리게 된다.

remove() 메서드를 이용하여 요소를 삭제하면 다음과 같다.

위와 같이 인덱스 0번 자리의 요소가 삭제되고 뒤에 있는 요소들은 한 자리씩 앞으로 당겨지게 된다.

따라서 O(n)의 시간복잡도를 가지게 된다.

간단한 예제 코드를 통하여 조금 더 정리해보자

        List<String> list = new ArrayList<>();
        list.add("Blueberry");
        list.add("Tomato");
        System.out.println(list);
     ------------------------------------
     [Blueberry, Tomato]

위와 같이 String 타입을 갖는 Arraylist를 생성하고 add() 메서드를 이용해 값을 추가하고 list의 모든 요소를 출력해보면 잘 추가된것을 알 수 있다.

        list.add(1,"Banana");
        System.out.println(list.size());
        System.out.println(list.get(1));
        --------------------------------
        3
        Banana

이번엔 인덱스 위치를 지정해서 값을 추가하고 list의 크기와
get() 메서드를 통하여 1번 인덱스의 값을 출력해보았다.

        list.remove(0);
        System.out.println(list);
        -------------------------
        [Banana, Tomato]

remove() 메서드를 이용하여 0번 인덱스의 값을 삭제 하고 list의 모든 값을 출력해보았다.
0번 인덱스에 있던 Blueberry는 삭제되고 그 자리에 1번 인덱스의 값인 Banana, 2번 인덱스의 값인 Tomato가 0,1번 자리로 들어와서
[Banana, Tomato] 값이 출력되는 것을 볼 수있다.

Arraylist가 동적으로 크기가 변한다는 것은 위에서 정리를 하였다.

크기에는 Capacity와 Size가 있는데 Capacity는 현재 list의 전체 크기, Size는 list의 저장된 요소의 갯수 이다.

Arraylist의 정리를 요약하자면

장점
. 동적 크기 조정
. 인덱스를 통한 접근으로 요소에 빠른 접근이 가능하다.
. 순서 유지 데이터를 순차적으로 관리하기 때문에 순서 유지가 가능하다.

단점
. 배열의 중간 요소를 삽입, 삭제시 뒤의 요소들을 이동해야하기대문에 O(n)의 시간복잡도를 가지게 되어 성능 저하가 있을 수 있다.
. list 내부 배열의 크기를 늘리거나 줄일 때 새로운 배열을 만들고 복사를 하기 때문에 메모리 할당이 빈번하다.
등 여러 장/단점이 있다.

Arraylist는 자바에서 굉장히 많이 유용하게 사용 되며 자바에서 지원하는 여러 기능을 통하여 동적으로 관리하기 좋은 클래스이다. 하지만 사용하는 기능이나 목적에 따라 Linkedlist와 적절하게 사용을 해야할 것 같다.

다음에는 Linkedlist에 대하여 더 자세하게 공부하고 내용을 정리 해보도록 해야겠다.

공부하며 정리와 복습을 위해 저장한 기록입니다. 틀린 부분 및 개선할 부분이 있다면 알려주시면 감사하겠습니다 !

profile
꿈이 많은 개발자 호소인

0개의 댓글