배열
가장 기본적인 자료 구조인 배열에 대해서 먼저 알아보자.
배열의 특징 ( 인덱스 )
- 인덱스를 활용하면 매우 빠르게 데이터에 접근이 가능하다
- 인덱스를 통한 입력, 변경, 조회의 경우 단 한 번의 연산으로 원하는 위치에 도달할 수 있다.
배열의 인덱스
- 배열은 물리 메모리상에 순서대로 붙어서 선언된다
- 따라서 해당 배열이 저장하고 있는 자료형에 따라서 다음과 같은 연산이 가능하다
- 배열의 시작 위치 + 자료의 크기 * 인덱스 크기
- 즉, 배열의 크기와 무관하게 한 번의 연산으로 원하는 위치를 찾을 수 있게 된다
- 따라서 배열의 인덱스를 활용하는 연산이 매우 빠르게 된다
배열의 한계
- 배열은 생성하는 시점에 그 크기를 한 번만 정할 수 있고, 이후 수정할 수 없다
- 배열의 특정 위치에 값을 추가/삭제하기 위해서는 해당 인덱스로부터 뒤에 있는 값들에 대해서 이동하게 된다
- 따라서 데이터를 삽입하는 연산이 지속될 경우 배열의 크기를 넘어서 예외가 발생하게 될 것이다
- 동적으로 길이를 늘리고, 줄일 수 있다면 조금 더 편하게 배열을 사용할 수 있을 것이다.
배열 리스트 ( ArrayList )
배열의 경우 크게 2가지 불편함이 존재했다.
- 길이를 동적으로 변경할 수 없다
- 데이터를 추가/삭제할 때 모든 데이터를 직접 옮겨주어야 한다
배열의 이런 불편함을 해소하기 위해 만들어진 자료구조가 ArrayList 이다.
ArrayList 구조
ArrayList는 내부적으로 Object[] 을 갖고 있어 해당 배열에 데이터를 저장하게 된다.

또한 capacity를 통해 현재 Object 배열의 크기를 저장하고, size를 통해서 현재 ArrayList의 크기를 관리하게 된다.
ArrayList 작동
- 길이를 동적으로 변경할 수 없던 배열에 비해서 ArrayList는 동적으로 크기를 변경해준다.
- 예를 들어 현재 ArrayList에 4개의 값을 추가하게 되면 size = 4 , capacity도 4로 꽉 차있는 상태가 될 것이다.
- 이 다음에 또 하나의 값을 추가하게 되면, 크기가 더 큰 배열을 새로 생성하고, 기존의 배열에 있는 값을 복사한 후 ArrayList 객체가 새로 만들어진 객체를 참조하도록 만든다.
- 또한 값을 add 하는 과정에서 배열에서는 직접 값을 이동시켜주어야 했지만, ArrayList는 자동으로 과정을 진행해준다.
ArrayList 특징
- ArrayList의 경우 배열을 포함하고 있기 때문에 데이터에 대한 접근, 삭제, 삽입의 경우 모두 배열과 동일한 시간으로 이루어진다.
- 다만 삭제/삽입의 경우 직접 데이터를 이동시켜야 하는 배열과 다르게 기능을 메서드가 해주고 있다.
- 따라서 ArrayList는 배열을 조금 더 편하게 사용할 수 있도록 기능을 추가한 자료구조라고 볼 수 있다.
ArrayList 기능
ArrayList 생성 방법
- 기본적인 생성 방법
- ArrayList의 capacity를 미리 지정하는 방법
- 다른 컬렉션 프레임워크의 값을 갖고 생성하는 방법
ArrayList<Integer> arrayList1 = new ArrayList<>();
ArrayList<Integer> arrayList2 = new ArrayList<>(500);
ArrayList<Integer> arrayList3 = new ArrayList<>(Arrays.asList(2, 3, 4));
ArrayList<Integer> arrayList4 = new ArrayList<>(arrayList3);
요소 추가
- 요소를 현재 리스트의 가장 뒤에 추가
- 컬렉션의 모든 요소를 리스트의 가장 뒤에 붙여서 추가
arrayList1.add(1);
arrayList1.addAll(arrayList4);
요소 삽입
- 동일한 add 메서드를 사용할 때, 인덱스를 지정해서 추가할 위치를 지정할 수 있다.
arrayList1.add(1, 10);
arrayList1.addAll(1, arrayList4);
요소 삭제
- 특정 인덱스에 위치한 요소를 제거
- 특정 객체의 값을 제거 ( 가장 앞에 있는 객체를 제거한다 )
- 컬렉션 프레임워크에 존재하는 값들에 해당하는 값을 모두 제거
arrayList1.remove(arrayList1.size() - 1);
arrayList1.remove((Integer) 10);
arrayList1.removeAll(Arrays.asList(3));
요소 검색
- ArrayList가 비어있는지 여부를 boolean으로 반환
- 특정 객체 값을 포함하고 있는지 여부를 boolean으로 반환
- 특정 객체 값이 처음 위치하는 인덱스를 반환
System.out.println(arrayList2.isEmpty());
System.out.println(arrayList1.contains((Integer) 3));
System.out.println(arrayList1.indexOf(3));
요소 얻기
- index에 위치한 요소를 반환한다
arrayList1.get(0)
요소 변경
- index 에 위치한 요소의 값을 변경한다
arrayList1.set(0, 100);
ArrayList 복제
- Object 로 반환하기 때문에 캐스팅을 해주어야 한다
- 또한 깊은 복사가 진행되어서 list5와 arrayList1의 구성은 동일하지만 list5를 수정해도 arrayList1이 변경되지 않는다.
ArrayList<Integer> list5 = (ArrayList<Integer>) arrayList1.clone();
ArrayList 변환
- ArrayList를 배열로 변환하여 반환한다
- 이 때 다음과 같은 형식의 캐스팅이 필요하다
Integer[] arr = arrayList1.toArray(new Integer[0]);'TIL > Java' 카테고리의 다른 글
| [Java] LinkedList - 컬렉션 프레임워크 (1) | 2025.02.19 |
|---|---|
| [Java] 제네릭 개요 (1) | 2025.02.15 |
| [Java] 날짜와 시간 데이터 다루기 (0) | 2025.02.11 |
| [Java] 열거형 - enum (0) | 2025.02.09 |
| [Java] 래퍼 클래스 (1) | 2025.02.09 |