배열(Array)와 리스트(List), ArrayList

이동엽·2023년 9월 8일

1. 배열과 리스트

여러 개의 데이터를 하나의 이름으로 그룹핑해서 관리하기 위한 자료구조라는 점에서 같다. 차이점은 다음과 같다.

저장방식크기 할당속도
Array(배열)정해진 공간이 있다.
그 모든 곳의 식별자(인덱스)가 존재한다.
ex) str[i]
객체 생성시 크기 할당이 필수다.
ex) char[] c = new char[3]
삽입/삭제 : 느림
데이터 조회 : 빠름
List(리스트)식별자(인덱스)가 없다.
앞의 요소가 삭제되면 새로 추가되는 요소가 그 공간에 저장될 수 있다.
크기 할당이 필요 없다.(자바에선 자동으로 1.5배씩 늘어난다.)삽입/삭제 : 빠름
데이터 조회 : 느림

배열의 크기를 구할 때는 length, 리스트의 크기를 구할 때는 size를 써야한다.

2. ArrayList란?

Array(배열)와 List(리스트)의 장점을 합친 것이다. 즉, 배열의 특성인 index로 식별자를 쓰는 것이 가능하고, 리스트 특성 그대로 크기를 동적으로 사용할 수 있다. 자바에서 인덱스를 쓸 수 있는 리스트라고 생각하면 좋을 듯 하다.

ArrayList는 내부에서 처음 설정한 저장 용량이 있다. 설정한 저장 용량 크기를 넘어서 더 많은 객체가 들어오면 배열 크기를 1.5배로 증가시킨다. (저장 용량을 설정하지 않으면 capacity = 10)

// DEFAULT_CAPACITY=10
// 기본 저장용량 10으로 리스트 생성
List<String> list = new ArrayList<>(); 

// 저장 용량을 100으로 설정해 ArrayList 생성 
List<String> list = new ArrayList<>(100);

ArrayList에서 특정 인덱스의 객체를 제거하게 되면, 제거한 객체의 인덱스부터 마지막 인덱스까지 모두 앞으로 1칸씩 앞으로 이동한다. 객체를 추가하게 되면 1칸씩 뒤로 이동하게 된다. 인덱스 값을 유지하기 위해서 전체 객체가 위치가 이동한다.
따라서 잦은 원소의 이동, 삭제가 발생할 경우 ArrayList보다 LinkedList를 사용하는 것이 좋다.

3. ArrayList 사용법

ArrayList 생성

// import java.util.ArrayList;

ArrayList<Integer> integers1 = new ArrayList<Integer>(); // 타입 지정
ArrayList<Integer> integers2 = new ArrayList<>(); // 타입 생략 가능
ArrayList<Integer> integers3 = new ArrayList<>(10); // 초기 용량(Capacity) 설정
ArrayList<Integer> integers4 = new ArrayList<>(integers1); // 다른 Collection값으로 초기화
ArrayList<Integer> integers5 = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5)); // Arrays.asList()

ArrayList 요소 추가/변경

import java.util.ArrayList;

public class ArrayListTest {
    public static void main(String[] args) {
        ArrayList<String> colors = new ArrayList<>();
        // add() method
        colors.add("Black");
        colors.add("White");
		// Green이 Index 0에 추가되면서 Black과 White는 각각 한 칸씩 밀리게 됨
        colors.add(0, "Green");
        colors.add("Red");

        // set() method : set 메소드를 통해 가장 앞(Index : 0)의 Green이 Blue로 변경
        colors.set(0, "Blue");

        System.out.println(colors);
    }
}

// [Blue, Black, White, Red]

ArrayList 요소 삭제

import java.util.ArrayList;
import java.util.Arrays;

public class ArrayListTest {
    public static void main(String[] args) {
        ArrayList<String> colors = new ArrayList<>(Arrays.asList("Black", "White", "Green", "Red"));
        String removedColor = colors.remove(0);
        System.out.println("Removed color is " + removedColor);

        colors.remove("White");
        System.out.println(colors);

        colors.clear();
        System.out.println(colors);
    }
}

ArrayList의 전체 값 확인

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.ListIterator;

public class ArrayListTest {
    public static void main(String[] args) {
        ArrayList<String> colors = new ArrayList<>(Arrays.asList("Black", "White", "Green", "Red"));
        // for-each loop
        for (String color : colors) {
            System.out.print(color + "  ");
        }
        System.out.println();

        // for loop
        for (int i = 0; i < colors.size(); ++i) {
            System.out.print(colors.get(i) + "  ");
        }
        System.out.println();

        // using iterator
        Iterator<String> iterator = colors.iterator();
        while (iterator.hasNext()) {
            System.out.print(iterator.next() + "  ");
        }
        System.out.println();

        // using listIterator : 역방향으로 출력된다.
        ListIterator<String> listIterator = colors.listIterator(colors.size());
        while (listIterator.hasPrevious()) {
            System.out.print(listIterator.previous() + "  ");
        }
        System.out.println();
    }
}

ArrayList 속 값 존재 유무 확인

import java.util.ArrayList;
import java.util.Arrays;

public class ArrayListTest {
    public static void main(String[] args) {
        ArrayList<String> colors = new ArrayList<>(Arrays.asList("Black", "White", "Green", "Red"));
        boolean contains = colors.contains("Black");
        System.out.println(contains);

        int index = colors.indexOf("Blue");
        System.out.println(index);

        index = colors.indexOf("Red");
        System.out.println(index);
    }
}

// contains()는 값이 있는 경우 true, 없으면 false를 return
// indexOf()는 값이 존재하는 경우 해당 요소 인덱스 return, 없으면 -1 return

0개의 댓글