Java ArrayList 메서드 마스터: 예제와 실제 사용 사례를 포함한 완전 가이드
Source: Dev.to
실제 ArrayList란 무엇인가?
내부적으로 ArrayList는 여전히 배열을 사용하지만, 크기 조정 로직을 자동으로 처리해 줍니다. 공간이 부족해지면 더 큰 배열을 만들고 모든 요소를 복사합니다. 그 결과 동적 배열이 되어 빠른 인덱스 기반 접근과 리스트의 유연성을 동시에 제공합니다.
왜 신경 써야 할까?
- 미리 몇 개의 아이템이 들어갈지 모를 때.
- 아이템을 자주 추가·삭제해야 할 때.
- 여전히 빠른 임의 접근이 필요할 때(예: 5번째 위치의 아이템을 바로 가져오기).
- 다른 컬렉션의 특수 기능이 필요 없을 때(예: 끝에서 상수 시간 삽입을 위한
LinkedList, 중복 방지를 위한HashSet등).
핵심 ArrayList 메서드, 실제 코드와 함께 해설
기본: 추가와 접근
add(E element) & add(int index, E element)
ArrayList socialApps = new ArrayList<>();
socialApps.add("Instagram"); // 끝에 추가
socialApps.add("Twitter");
socialApps.add(1, "TikTok"); // 인덱스 1에 삽입
// 현재 순서: ["Instagram", "TikTok", "Twitter"]
실제 사용 예: 사용자 권한에 따라 Android 앱에서 동적으로 메뉴 리스트를 구성할 때.
get(int index)
String currentFav = socialApps.get(0); // "Instagram"
팁: 프로덕션에서는 IndexOutOfBoundsException을 피하기 위해 항상 범위를 확인하거나 안전한 메서드를 사용하세요.
set(int index, E element)
socialApps.set(2, "Snapchat"); // 인덱스 2의 요소를 교체
내부 확인: 체크와 검색
- size() –
array.length대신 사용.socialApps.size()는3을 반환합니다. - isEmpty() – 리스트에 요소가 없으면
true를 반환합니다. - contains(Object o) & indexOf(Object o)
boolean hasTikTok = socialApps.contains("TikTok"); // true
int pos = socialApps.indexOf("Instagram"); // 0
실제 사용 예: 회원 가입 전에 사용자 이름이 이미 존재하는지 검증할 때.
정리 담당: 요소 삭제
remove(int index) & remove(Object o)
socialApps.remove(1); // 인덱스 1의 "TikTok" 삭제
socialApps.remove("X"); // 객체 "X" 삭제 시도
주의:
remove(1)은 인덱스로 삭제하고,remove(Integer.valueOf(1))은ArrayList에 들어있는 숫자1을 삭제합니다.
clear() – 모든 요소를 삭제해 빈 리스트가 됩니다.
socialApps.clear(); // 리스트가 이제 비어 있음
한 단계 업그레이드: 대량 연산과 반복
addAll(Collection c) – 리스트를 손쉽게 병합합니다.
ArrayList newApps = new ArrayList<>(Arrays.asList("Threads", "Bluesky"));
socialApps.addAll(newApps);
subList(int fromIndex, int toIndex) – 리스트의 일부분에 대한 뷰를 얻습니다(복사가 아님). 페이지네이션에 유용합니다.
ArrayList 반복하기
// For‑each (간단)
for (String app : socialApps) {
System.out.println(app);
}
// Iterator (반복 중 삭제에 안전)
Iterator it = socialApps.iterator();
while (it.hasNext()) {
if (it.next().contains("a")) {
it.remove(); // 반복 중 안전하게 삭제
}
}
// Java 8+ forEach with lambda (깔끔)
socialApps.forEach(app -> System.out.println(app));
Initial Capacity – 예를 들어 10 000개의 아이템을 저장할 예정이라면 new ArrayList<>(10000)을 사용해 반복적인 리사이징을 방지하세요.
성능 참고 사항
get(index)와set(index, element)는 O(1) – 상수 시간.add(element)는 O(1) amortized (대부분 빠르며, 가끔 리사이징 시 복사가 발생).add(index, element)와remove(index)는 O(n) – 리스트 앞쪽에서 작업할 경우 요소 이동 때문에 느려짐.- 동기화:
ArrayList는 스레드에 안전하지 않습니다. 여러 스레드가 접근한다면Collections.synchronizedList(new ArrayList<>())혹은 concurrent 컬렉션을 사용하세요. - 복사:
new ArrayList<>(oldList)는 얕은 복사를 수행합니다; 내부 객체는 리스트 간에 공유됩니다.
실제 사용 사례: 전자상거래 쇼핑 카트
ArrayList cart = new ArrayList<>();
// 사용자가 아이템 추가
cart.add(new CartItem("Java Programming Book", 1, 29.99));
cart.add(new CartItem("USB‑C Cable", 2, 15.99));
// 첫 번째 아이템 수량 업데이트
CartItem firstItem = cart.get(0);
firstItem.setQuantity(2);
// 사용자가 아이템 삭제
cart.removeIf(item -> item.getName().contains("Cable")); // 모든 케이블 삭제
// 결제 – 총액 계산
double total = 0;
for (CartItem item : cart) {
total += item.getPrice() * item.getQuantity();
}
// 주문 후 카트 비우기
cart.clear();
FAQ
- Q: 2024년 기준 Array와 ArrayList는 어떤 차이가 있나요?
- Q: ArrayList를 어떻게 정렬하나요?
- Q: 원시 타입을 ArrayList에 저장할 수 있나요?
- Q: ArrayList가 메모리 효율적인가요?
마무리
컬렉션은 전문 Java 개발에서 매우 중요한 부분입니다. ArrayList 메서드를 숙달하면 프로덕션 수준 애플리케이션을 구축할 탄탄한 기반을 갖게 됩니다. 계속해서 실험하고 코드를 작성하며, 동적 리스트가 여러분을 도와주도록 하세요!