ArrayList란?
ArrayList 클래스는 Java의 List 인터페이스를 구현한 가장 많이 사용하는 클래스 중 하나로, Array와 List의 장점을 결합한 자료구조입니다. 기본적으로 크기가 고정된 배열과 달리, ArrayList는 요소가 추가됨에 따라 자동으로 크기가 확장되며, 이로 인해 데이터를 동적으로 관리할 수 있습니다. ArrayList는 내부적으로 배열을 사용하여 데이터를 저장하지만, 이 배열의 크기가 가득 차면 새로운 크기의 배열을 생성하고 기존 배열의 요소들을 복사하여 관리합니다.
ArrayList의 주요 특징
- 동적 크기 조정: ArrayList는 데이터가 추가됨에 따라 자동으로 크기를 확장합니다. 배열의 경우 고정된 크기를 가지지만, ArrayList는 필요에 따라 크기가 조정되어 유연한 데이터 저장이 가능합니다.
- 빠른 인덱스 접근: 배열과 마찬가지로, ArrayList는 인덱스를 통해 O(1) 시간 복잡도로 빠르게 요소에 접근할 수 있습니다. get(int index) 메서드를 통해 특정 인덱스의 요소를 즉시 가져올 수 있습니다.
- 연속된 메모리: ArrayList는 내부적으로 Object[] 배열을 사용하므로, 데이터가 메모리에 연속적으로 저장됩니다. 이는 인덱스 접근 속도를 빠르게 하는 요인 중 하나입니다.
- 중복 허용: ArrayList는 동일한 요소가 여러 번 포함될 수 있습니다. 데이터의 중복이 필요한 경우 유용합니다.
- 순서 유지: 요소가 삽입된 순서를 유지합니다. 따라서 순차적인 데이터 저장 및 처리에 적합합니다.
동적 크기 조정
ArrayList는 요소가 추가되면서 더 이상 공간이 없을 때 자동으로 배열의 크기를 조정합니다. 이 과정은 ArrayList의 성능에 큰 영향을 미칠 수 있습니다.
- Capacity : 배열의 실제 크기.
- Size : 현재 배열에 저장된 요소의 수.
ArrayList의 크기 조정은 새로운 배열을 생성하고 기존 요소를 복사하는 과정으로 이루어집니다. 이 과정에서 메모리와 CPU 자원을 많이 사용하기 때문에, ArrayList를 사용할 때는 예상되는 요소의 수를 미리 설정하는 것이 좋습니다.
메모리 관리
ArrayList는 동적 크기 조정 덕분에 편리하지만, 이로 인해 메모리 관리 측면에서 주의가 필요합니다. 예를 들어, 크기가 자주 변경되면 메모리 사용량이 비효율적일 수 있습니다. 또한, ArrayList가 더 이상 사용되지 않을 때는 clear() 메서드를 사용하여 내부 배열을 정리하는 것이 좋습니다.
ArrayList<String> list = new ArrayList<>(100); // 초기 용량 100으로 설정
이처럼 초기 용량을 설정하면 불필요한 크기 조정을 줄일 수 있습니다.
ArrayList의 장단점
- 장점
- 동적 크기 조정: ArrayList는 요소가 추가됨에 따라 크기가 자동으로 확장되므로, 미리 크기를 정하지 않아도 됩니다.
- 빠른 요소 접근: 배열과 달리 메모리에 연속적으로 나열되어 있지 않고, 주소로 연결되어 있는 형태이기 때문에 인덱스를 사용해 O(1) 시간 복잡도로 요소에 빠르게 접근할 수 있습니다.
- 순서 유지: 요소가 삽입된 순서를 유지하므로, 순차적으로 데이터를 관리해야 하는 경우에 유용합니다.
- 단점
- 삽입/삭제 시 성능 저하: ArrayList의 크기가 가득 차면 새로운 배열을 생성하고 데이터를 복사해야 하므로, 삽입 및 삭제 작업이 많을 경우 성능이 저하될 수 있습니다.
- 메모리 사용: 동적 배열로 인해 추가적인 메모리 사용이 필요하며, 배열의 크기를 자주 조정하는 경우 메모리 효율성이 떨어질 수 있습니다.
- 스레드 안전성 부족: ArrayList는 동기화되지 않으므로, 멀티스레드 환경에서 사용할 경우 스레드 안전성이 보장되지 않습니다.
ArrayList의 구조 및 동작 원리

ArrayList 객체 생성
ArrayList를 사용하려면 java.util.ArrayList; 패키지를 import 해야 합니다.
import java.util.ArrayList;
import java.util.List;
import java.util.Arrays;
List<String> fruits = new ArrayList<String>(); // 타입 지정
List<String> fruits2 = new ArrayList<>(); // 타입 생략 가능
List<String> fruits3 = new ArrayList<>(10); // 초기 용량(Capacity) 설정
List<String> fruits4 = new ArrayList<>(fruits3); // 다른 Collection값으로 초기화
List<String> fruits5 = new ArrayList<>(Arrays.asList("Grape", "Cherry", "Banana", "Melon")); // Arrays.asList()
ArrayList는 내부적으로 배열을 사용하여 데이터를 저장합니다. 처음 ArrayList가 생성될 때, 기본적으로 크기가 10인 배열이 생성됩니다. 이후 요소가 추가되면서 배열의 크기가 가득 차면, ArrayList는 기존 배열의 크기를 1.5배로 늘려 새로운 배열을 생성하고, 기존 데이터를 복사하여 저장합니다.
ArrayList 요소 삽입 및 수정
import java.util.ArrayList;
import java.util.List;
public class ArrayListSample {
public static void main(String[] args) {
List<String> fruits = new ArrayList<>();
fruits.add("Apple");
fruits.add("Banana");
fruits.add(0, "Grape");
fruits.add("Melon");
fruits.set(1, "Cherry");
System.out.println(fruits);
// Grape, Cherry, Banana, Melon
}
}
ArrayList를 생성한 후에 add() 메서드를 사용해서 요소를 추가하거나 중간에 삽입할 수 있습니다. add() 메서드는 기본적으로 리스트의 가장 끝에 값을 추가하며, 별도의 인덱스를 지정하여 원하는 위치에 요소를 추가시키며, 그 인덱스로부터 값들을 1 칸씩 미룰 수 있습니다. 그리고 set() 메서드를 통해 기존에 삽입되어 있는 요소를 변경하는 것도 가능합니다.
ArrayList 요소 삭제
import java.util.ArrayList;
import java.util.List;
import java.util.Arrays;
public class ArrayListSample {
public static void main(String[] args) {
List<String> fruits = new ArrayList<>(Arrays.asList("Grape", "Cherry", "Banana", "Melon"));
String removedFruit = fruits.remove(0);
System.out.println("Removed fruit : " + removedFruit); // Grape
fruits.remove("Cherry");
System.out.println(fruits);// Banana, Melon
fruits.clear();
System.out.println(fruits); // empty
}
}
삽입되어 있는 값을 삭제할 때는 remove() 메서드를 사용합니다. 요소의 인덱스 또는 직접적인 요소 값을 삽입하여 삭제할 수 있으며, 인덱스를 통해 삭제할 경우에는 삭제되는 요소 값을 반환받아서 사용할 수 있습니다. 즉, 값을 지움과 동시에 해당 값으로 별도의 작업이 필요한 경우에는 리턴 받아서 사용하면 됩니다. 그리고 ArrayList의 값을 전체 삭제할 경우에는 clear() 메서드를 사용하면 됩니다.
ArrayList 값 존재 유무 확인
import java.util.ArrayList;
import java.util.List;
import java.util.Arrays;
public class ArrayListTest {
public static void main(String[] args) {
List<String> students = new ArrayList<>(Arrays.asList("Kim", "Lee", "Hong", "Koo"));
boolean contains = students.contains("Lee");
System.out.println(contains); // true
int index = students.indexOf("Chu");
System.out.println(index); // -1
index = students.indexOf("Hong");
System.out.println(index); // 2
}
}
ArrayList 안에 값이 존재하는지 확인하기 위해서 contains() 메서드를 사용합니다. contains() 메서드는 값이 있는 경우 true, 없는 경우 false를 반환합니다. 그리고 값이 존재할 때 어느 위치에 삽입된지 확인하기 위해서는 indexOf() 메서드를 사용합니다. indexOf() 메서드는 값이 존재하지 않을 경우 -1을 반환하기 때문에 별도로 처리도 가능합니다.
ArrayList 값 출력
import java.util.ArrayList;
import java.util.List;
import java.util.Arrays;
import java.util.Iterator;
import java.util.ListIterator;
public class ArrayListTest {
public static void main(String[] args) {
List<String> fruits = new ArrayList<>(Arrays.asList("Grape", "Cherry", "Banana", "Melon"));
// for-each loop
for (String fruit : fruits) {
System.out.println(fruit + " ");
}
// for loop
for (int i = 0; i < fruits.size(); ++i) {
System.out.println(fruits.get(i) + " ");
}
// using iterator
Iterator<String> iterator = fruits.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next() + " ");
}
// using listIterator
ListIterator<String> listIterator = fruits.listIterator(fruits.size());
while (listIterator.hasPrevious()) {
System.out.println(listIterator.previous() + " ");
}
}
}
ArrayList vs LinkedList
ArrayList와 LinkedList는 모두 List 인터페이스를 구현하지만, 서로 다른 자료구조이기 때문에 사용 목적에 따라 적합한 자료구조를 선택해야 합니다.
- ArrayList : 읽기와 검색이 빠른 반면, 삽입 및 삭제는 상대적으로 느립니다. 데이터의 크기가 자주 변하지 않고, 접근이 빈번한 경우에 적합합니다.
- LinkedList : 삽입 및 삭제가 빠르지만, 읽기와 검색이 느립니다. 데이터의 크기가 자주 변하고, 삽입 및 삭제 작업이 빈번한 경우에 적합합니다.
결론
ArrayList는 Java에서 가장 널리 사용되는 자료구조 중 하나로, 동적 배열의 유연성과 배열의 빠른 데이터 접근 속도를 결합한 강력한 도구입니다. 크기가 동적으로 조정되어 데이터를 효율적으로 관리할 수 있으며, 다양한 메서드를 통해 리스트를 쉽게 조작할 수 있습니다. 그러나 중간 삽입 및 삭제 시 성능 저하가 발생할 수 있으므로, 이러한 상황에서는 다른 리스트 구현체를 고려할 필요가 있습니다. ArrayList는 일반적인 리스트 사용 시 기본적으로 고려해야 할 구현체 중 하나입니다.
Ref.
'🚀 컴퓨터 지식 > 자료구조' 카테고리의 다른 글
[자료구조] 자바 Stack 후입선출(LIFO) 클래스 가이드 (0) | 2024.08.21 |
---|---|
[Data Structure] 자료구조 Vector 멀티스레드 환경에서 안전한 리스트 구현체 (0) | 2024.08.17 |
[Data Structure] 자료구조 LinkedList 효율적인 데이터 삽입과 삭제를 위한 연결 리스트 (0) | 2024.05.27 |
[자료구조] 자바 List 인터페이스(Interface) 기본 개념 및 활용 (0) | 2024.05.22 |
[자료구조] Java Collections Framework 필수 개념과 활용법 (0) | 2024.05.22 |
ArrayList란?
ArrayList 클래스는 Java의 List 인터페이스를 구현한 가장 많이 사용하는 클래스 중 하나로, Array와 List의 장점을 결합한 자료구조입니다. 기본적으로 크기가 고정된 배열과 달리, ArrayList는 요소가 추가됨에 따라 자동으로 크기가 확장되며, 이로 인해 데이터를 동적으로 관리할 수 있습니다. ArrayList는 내부적으로 배열을 사용하여 데이터를 저장하지만, 이 배열의 크기가 가득 차면 새로운 크기의 배열을 생성하고 기존 배열의 요소들을 복사하여 관리합니다.
ArrayList의 주요 특징
- 동적 크기 조정: ArrayList는 데이터가 추가됨에 따라 자동으로 크기를 확장합니다. 배열의 경우 고정된 크기를 가지지만, ArrayList는 필요에 따라 크기가 조정되어 유연한 데이터 저장이 가능합니다.
- 빠른 인덱스 접근: 배열과 마찬가지로, ArrayList는 인덱스를 통해 O(1) 시간 복잡도로 빠르게 요소에 접근할 수 있습니다. get(int index) 메서드를 통해 특정 인덱스의 요소를 즉시 가져올 수 있습니다.
- 연속된 메모리: ArrayList는 내부적으로 Object[] 배열을 사용하므로, 데이터가 메모리에 연속적으로 저장됩니다. 이는 인덱스 접근 속도를 빠르게 하는 요인 중 하나입니다.
- 중복 허용: ArrayList는 동일한 요소가 여러 번 포함될 수 있습니다. 데이터의 중복이 필요한 경우 유용합니다.
- 순서 유지: 요소가 삽입된 순서를 유지합니다. 따라서 순차적인 데이터 저장 및 처리에 적합합니다.
동적 크기 조정
ArrayList는 요소가 추가되면서 더 이상 공간이 없을 때 자동으로 배열의 크기를 조정합니다. 이 과정은 ArrayList의 성능에 큰 영향을 미칠 수 있습니다.
- Capacity : 배열의 실제 크기.
- Size : 현재 배열에 저장된 요소의 수.
ArrayList의 크기 조정은 새로운 배열을 생성하고 기존 요소를 복사하는 과정으로 이루어집니다. 이 과정에서 메모리와 CPU 자원을 많이 사용하기 때문에, ArrayList를 사용할 때는 예상되는 요소의 수를 미리 설정하는 것이 좋습니다.
메모리 관리
ArrayList는 동적 크기 조정 덕분에 편리하지만, 이로 인해 메모리 관리 측면에서 주의가 필요합니다. 예를 들어, 크기가 자주 변경되면 메모리 사용량이 비효율적일 수 있습니다. 또한, ArrayList가 더 이상 사용되지 않을 때는 clear() 메서드를 사용하여 내부 배열을 정리하는 것이 좋습니다.
ArrayList<String> list = new ArrayList<>(100); // 초기 용량 100으로 설정
이처럼 초기 용량을 설정하면 불필요한 크기 조정을 줄일 수 있습니다.
ArrayList의 장단점
- 장점
- 동적 크기 조정: ArrayList는 요소가 추가됨에 따라 크기가 자동으로 확장되므로, 미리 크기를 정하지 않아도 됩니다.
- 빠른 요소 접근: 배열과 달리 메모리에 연속적으로 나열되어 있지 않고, 주소로 연결되어 있는 형태이기 때문에 인덱스를 사용해 O(1) 시간 복잡도로 요소에 빠르게 접근할 수 있습니다.
- 순서 유지: 요소가 삽입된 순서를 유지하므로, 순차적으로 데이터를 관리해야 하는 경우에 유용합니다.
- 단점
- 삽입/삭제 시 성능 저하: ArrayList의 크기가 가득 차면 새로운 배열을 생성하고 데이터를 복사해야 하므로, 삽입 및 삭제 작업이 많을 경우 성능이 저하될 수 있습니다.
- 메모리 사용: 동적 배열로 인해 추가적인 메모리 사용이 필요하며, 배열의 크기를 자주 조정하는 경우 메모리 효율성이 떨어질 수 있습니다.
- 스레드 안전성 부족: ArrayList는 동기화되지 않으므로, 멀티스레드 환경에서 사용할 경우 스레드 안전성이 보장되지 않습니다.
ArrayList의 구조 및 동작 원리

ArrayList 객체 생성
ArrayList를 사용하려면 java.util.ArrayList; 패키지를 import 해야 합니다.
import java.util.ArrayList;
import java.util.List;
import java.util.Arrays;
List<String> fruits = new ArrayList<String>(); // 타입 지정
List<String> fruits2 = new ArrayList<>(); // 타입 생략 가능
List<String> fruits3 = new ArrayList<>(10); // 초기 용량(Capacity) 설정
List<String> fruits4 = new ArrayList<>(fruits3); // 다른 Collection값으로 초기화
List<String> fruits5 = new ArrayList<>(Arrays.asList("Grape", "Cherry", "Banana", "Melon")); // Arrays.asList()
ArrayList는 내부적으로 배열을 사용하여 데이터를 저장합니다. 처음 ArrayList가 생성될 때, 기본적으로 크기가 10인 배열이 생성됩니다. 이후 요소가 추가되면서 배열의 크기가 가득 차면, ArrayList는 기존 배열의 크기를 1.5배로 늘려 새로운 배열을 생성하고, 기존 데이터를 복사하여 저장합니다.
ArrayList 요소 삽입 및 수정
import java.util.ArrayList;
import java.util.List;
public class ArrayListSample {
public static void main(String[] args) {
List<String> fruits = new ArrayList<>();
fruits.add("Apple");
fruits.add("Banana");
fruits.add(0, "Grape");
fruits.add("Melon");
fruits.set(1, "Cherry");
System.out.println(fruits);
// Grape, Cherry, Banana, Melon
}
}
ArrayList를 생성한 후에 add() 메서드를 사용해서 요소를 추가하거나 중간에 삽입할 수 있습니다. add() 메서드는 기본적으로 리스트의 가장 끝에 값을 추가하며, 별도의 인덱스를 지정하여 원하는 위치에 요소를 추가시키며, 그 인덱스로부터 값들을 1 칸씩 미룰 수 있습니다. 그리고 set() 메서드를 통해 기존에 삽입되어 있는 요소를 변경하는 것도 가능합니다.
ArrayList 요소 삭제
import java.util.ArrayList;
import java.util.List;
import java.util.Arrays;
public class ArrayListSample {
public static void main(String[] args) {
List<String> fruits = new ArrayList<>(Arrays.asList("Grape", "Cherry", "Banana", "Melon"));
String removedFruit = fruits.remove(0);
System.out.println("Removed fruit : " + removedFruit); // Grape
fruits.remove("Cherry");
System.out.println(fruits);// Banana, Melon
fruits.clear();
System.out.println(fruits); // empty
}
}
삽입되어 있는 값을 삭제할 때는 remove() 메서드를 사용합니다. 요소의 인덱스 또는 직접적인 요소 값을 삽입하여 삭제할 수 있으며, 인덱스를 통해 삭제할 경우에는 삭제되는 요소 값을 반환받아서 사용할 수 있습니다. 즉, 값을 지움과 동시에 해당 값으로 별도의 작업이 필요한 경우에는 리턴 받아서 사용하면 됩니다. 그리고 ArrayList의 값을 전체 삭제할 경우에는 clear() 메서드를 사용하면 됩니다.
ArrayList 값 존재 유무 확인
import java.util.ArrayList;
import java.util.List;
import java.util.Arrays;
public class ArrayListTest {
public static void main(String[] args) {
List<String> students = new ArrayList<>(Arrays.asList("Kim", "Lee", "Hong", "Koo"));
boolean contains = students.contains("Lee");
System.out.println(contains); // true
int index = students.indexOf("Chu");
System.out.println(index); // -1
index = students.indexOf("Hong");
System.out.println(index); // 2
}
}
ArrayList 안에 값이 존재하는지 확인하기 위해서 contains() 메서드를 사용합니다. contains() 메서드는 값이 있는 경우 true, 없는 경우 false를 반환합니다. 그리고 값이 존재할 때 어느 위치에 삽입된지 확인하기 위해서는 indexOf() 메서드를 사용합니다. indexOf() 메서드는 값이 존재하지 않을 경우 -1을 반환하기 때문에 별도로 처리도 가능합니다.
ArrayList 값 출력
import java.util.ArrayList;
import java.util.List;
import java.util.Arrays;
import java.util.Iterator;
import java.util.ListIterator;
public class ArrayListTest {
public static void main(String[] args) {
List<String> fruits = new ArrayList<>(Arrays.asList("Grape", "Cherry", "Banana", "Melon"));
// for-each loop
for (String fruit : fruits) {
System.out.println(fruit + " ");
}
// for loop
for (int i = 0; i < fruits.size(); ++i) {
System.out.println(fruits.get(i) + " ");
}
// using iterator
Iterator<String> iterator = fruits.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next() + " ");
}
// using listIterator
ListIterator<String> listIterator = fruits.listIterator(fruits.size());
while (listIterator.hasPrevious()) {
System.out.println(listIterator.previous() + " ");
}
}
}
ArrayList vs LinkedList
ArrayList와 LinkedList는 모두 List 인터페이스를 구현하지만, 서로 다른 자료구조이기 때문에 사용 목적에 따라 적합한 자료구조를 선택해야 합니다.
- ArrayList : 읽기와 검색이 빠른 반면, 삽입 및 삭제는 상대적으로 느립니다. 데이터의 크기가 자주 변하지 않고, 접근이 빈번한 경우에 적합합니다.
- LinkedList : 삽입 및 삭제가 빠르지만, 읽기와 검색이 느립니다. 데이터의 크기가 자주 변하고, 삽입 및 삭제 작업이 빈번한 경우에 적합합니다.
결론
ArrayList는 Java에서 가장 널리 사용되는 자료구조 중 하나로, 동적 배열의 유연성과 배열의 빠른 데이터 접근 속도를 결합한 강력한 도구입니다. 크기가 동적으로 조정되어 데이터를 효율적으로 관리할 수 있으며, 다양한 메서드를 통해 리스트를 쉽게 조작할 수 있습니다. 그러나 중간 삽입 및 삭제 시 성능 저하가 발생할 수 있으므로, 이러한 상황에서는 다른 리스트 구현체를 고려할 필요가 있습니다. ArrayList는 일반적인 리스트 사용 시 기본적으로 고려해야 할 구현체 중 하나입니다.
Ref.
'🚀 컴퓨터 지식 > 자료구조' 카테고리의 다른 글
[자료구조] 자바 Stack 후입선출(LIFO) 클래스 가이드 (0) | 2024.08.21 |
---|---|
[Data Structure] 자료구조 Vector 멀티스레드 환경에서 안전한 리스트 구현체 (0) | 2024.08.17 |
[Data Structure] 자료구조 LinkedList 효율적인 데이터 삽입과 삭제를 위한 연결 리스트 (0) | 2024.05.27 |
[자료구조] 자바 List 인터페이스(Interface) 기본 개념 및 활용 (0) | 2024.05.22 |
[자료구조] Java Collections Framework 필수 개념과 활용법 (0) | 2024.05.22 |