정리 내용
1. List 인터페이스란?
2. List 인터페이스의 메서드 종류
3. ArrayList, LinkedList
List 인터페이스는 중복을 허용하면서
저장순서가 유지되는 특성을 가진 컬렉션 인터페이스

List 인터페이스의 메서드
(Collection 인터페이스로부터 상속받은 것은 공통이므로 제외)
|
메서드
|
설명
|
|
void add(int index, Object element)
boolean addAll(int index, Collection c) |
지정된 위치(index)에 객체 또는 컬렉션에 포함된 객체들을 추가
|
|
Object get(int index)
|
지정된 위치에 있는 객체를 반환
|
|
int indexOf(Object o)
|
지정된 객체의 위치를 반환
(List의 첫 번째 요소부터 순방향으로 찾음) |
|
int lastIndexOf(Object o)
|
지정된 객체의 위치를 반환
(List의 마지막 요소부터 역방향으로 찾음) |
|
ListIterator listIterator()
ListIterator listIterator(int index) |
List의 객체에 접근할 수 있는 ListIterator를 반환
|
|
Object remove(int index)
|
지정된 위치에 있는 객체를 삭제하고 삭제된 객체를 반환
|
|
Object set(int index, Object element)
|
지정된 위치에 객체를 저장
|
|
void sort(Comparator c)
|
지정된 비교자로 List를 정렬
|
|
List subList(int fromIndex, int toIndex)
|
지정된 범위에 있는 객체를 반환
|
ArrayLIst 메서드
- ArrayList는 List인터페이스를 구현하기 때문에 데이터의 저장순서가 유지되고 중복을 허용
- 기존의 Vector를 개선한 것이 ArrayList
- Object배열을 이용해서 데이터를 순차적으로 저장(Object이기 때문에 모든 종류의 객체를 담을 수 있음)
- 배열에 더 이상 저장할 공간이 없으면 보다 큰 새로운 배열을 생성해서 기존의 배열에 저장된 내용을 복사 후 저장
|
구분
|
메서드
|
설명
|
|
생성자
|
ArrayList()
|
크기가 0인 ArrayList 생성
|
|
ArrayList(Collection c)
|
주어진 컬렉션이 저장된 ArrayList를 생성
|
|
|
ArrayList(int initialCapacity)
|
지정된 초기용량을 갖는 ArrayList를 생성
|
|
|
추가
|
boolean add(Object o)
|
ArrayList의 마지막에 객체를 추가, 성공시 true
|
|
void add(int index, Object element)
|
지정된 위치에 객체를 저장
|
|
|
boolean addAll(Collection c)
|
주어진 컬렉션의 모든 객체를 저장
|
|
|
boolean addAll(int index, Collection c)
|
지정된 위치부터 주어진 컬렉션의 모든 객체를 저장
|
|
|
삭제
|
void clear()
|
ArrayList를 완전히 비움
|
|
Object remove(int index)
|
지정된 위치에 있는 객체를 제거
|
|
|
boolean remove(Object o)
|
지정된 객체를 제거, 성공시 true
|
|
|
boolean removeAll(Collection c)
|
지정한 컬렉션에 저장된 것과
동일한 객체들을 ArrayList에서 제거 |
|
|
boolean retainAll(Collection c)
|
ArrayList에 저장된 객체중에서
주어진 컬렉션과 공통된 것들만 남기고 나머지는 삭제 |
|
|
void trimToSize()
|
용량을 크기에 맞게 줄인다(빈공간 제거)
|
|
|
검색
|
boolean contains(Object o)
|
지정된 객체가 ArrayList에 포함되어 있는지 확인
|
|
void ensureCapacity(int minCapacity)
|
ArrayList의 용량이 최소한 minCapacity가 되도록 한다
|
|
|
Object get(int index)
|
지정된 위치에 저장된 객체를 반환
|
|
|
int indexOf(Object o)
|
지정된 객체가 저장된 위치를 찾아서 반환
|
|
|
boolean isEmpty()
|
ArrayList가 비어있는지 확인
|
|
|
Iterator iterator()
|
ArrayList의 Iterator 객체를 반환
|
|
|
int lastIndexOf(Object o)
|
객체가 저장된 위치를 끝부터 역방향으로 검색해서 반환
|
|
|
기타
|
ListIterator listIterator()
|
ArrayList의 ListIterator를 반환
|
|
ListIterator listIterator(int index)
|
ArrayList의 지정된 위치부터 시작하는 ListIterator를 반환
|
|
|
Object set(int index, Object element)
|
주어진 객체를 지정된 위치에 저장
|
|
|
int size()
|
ArrayList에 저장된 객체의 개수를 반환
|
|
|
void sort(Comparator c)
|
지정된 정렬기준으로 ArrayList를 정렬
|
|
|
List subList(int fromIndex, int toIndex)
|
fromIndex부터 toIndex사이에 저장된 객체를 반환
|
|
|
Object[] toArray()
|
ArrayList에 저장된 모든 객체들을 객체배열로 반환
|
|
|
Object[] toArray(Object[] a)
|
ArrayList에 저장된 모든 객체들을 객체배열 a에 담아 반환
|
|
|
Object clone()
|
ArrayList를 복제
|
ArrayList 메서드 활용 예제
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
public class Main6 {
public static void main(String[] args) {
ArrayList list1 = new ArrayList();
// ArrayList에 값 저장
list1.add(5);
list1.add(4);
list1.add(2);
list1.add(0);
list1.add(1);
list1.add(3);
ArrayList list2 = new ArrayList(list1.subList(1, 4));
print(list1, list2);
Collections.sort(list1);
Collections.sort(list2);
print(list1, list2);
System.out.println("list1.containsAll(list2): " + list1.containsAll(list2));
list2.add("B");
list2.add("C");
list2.add(3, "A");
print(list1, list2);
System.out.println("list1.retainAll(list2): " + list1.retainAll(list2));
print(list1, list2);
for (int i = 0; i < list2.size(); i++) {
if (list1.contains(list2.get(i)))
list2.remove(i);
}
print(list1, list2);
}
static void print(ArrayList list1, ArrayList list2) {
System.out.println("list1: " + list1);
System.out.println("list2: " + list2);
System.out.println();
}
}
-------------------------------
list1: [5, 4, 2, 0, 1, 3]
list2: [4, 2, 0]
list1: [0, 1, 2, 3, 4, 5]
list2: [0, 2, 4]
list1.containsAll(list2): true
list1: [0, 1, 2, 3, 4, 5]
list2: [0, 2, 4, A, B, C]
list1.retainAll(list2): true
list1: [0, 2, 4]
list2: [0, 2, 4, A, B, C]
list1: [0, 2, 4]
list2: [2, A, B, C]
ArrayList의 추가 및 삭제
만약, 삭제할 객체가 마지막 데이터라면 복사할 필요 없이 단순히 null로 변경해주면 된다.

ArrayList의 삭제과정을 살펴보자(remove(2)를 호출했다고 가정)
① 삭제할 데이터의 아래에 있는 데이터를 한 칸 씩 위로 복사해서 삭제할 데이터를 덮어쓴다.
② 데이터가 모두 한 칸씩 위로 이동하였으므로 마지막 데이터는 null로 변경해야한다.
③ 데이터가 삭제되어 데이터의 size가 줄었으므로 size의 값을 1 감소시킨다.
배열의 중간에 위치한 객체를 추가하거나 삭제하는 경우 다른 데이터의 위치를 이동시켜줘야 하기 때문에
데이터의 개수가 많을 수록 작업시간이 오래 걸린다.
새로운 요소를 추가할때도 먼저 추가할 위치 이후의 요소들을 모두 한 칸씩 이동시킨 후에 저장해야 한다.
LinkedList
배열은 가장 기본적인 형태의 자료구조로 간단하며 사용하기 쉽고
데이터를 읽어 오는데 걸리는 시간이 가장 빠르다는 장점을 가지고 있다.
하지만 크기를 변경할 수 없고,
배열 중간에 데이터의 추가 또는 삭제(더 큰 배열 생성 - 복사 - 참조변경)에
시간이 많이 걸린다는 단점이 있다.
(메서드 형태는 ArrayList와 크게 다르지 않다)
이러한 배열의 단점을 보완하기 위한 것이 LinkedList이다.
배열은 모든 데이터가 연속적으로 존재하지만,
LinkedList는 불연속적으로 존재하는 데이터를 서로 연결한 형태이다.

LinkedList에서의 데이터는 삭제가 간단하다.
단 하나의 참조만 변경하면, 삭제가 이루어지는 것이다.
배열처럼 복사하는 과정이 없기 때문에 처리속도가 매우 빠르다.

데이터 추가 또한 새로운 요소를 생성 후 추가하고자 하는 위치의 이전요소의 참조를 새로운 요소에 대한 참조로
변경해주고, 새로운 요소가 다음 요소를 참조하도록 변경해주면 되므로 처리속도가 매우 빠르다.
그럼 어떤 상황에에 ArrayList 혹은 LinkedList를 쓰는 것이 좋은 것일까?
|
컬렉션
|
읽기
|
추가 / 삭제
|
특징
|
|
ArrayList(배열)
|
빠르다
|
느리다
|
- 순차적인 추가삭제
- 비효율적인 메모리 사용 |
|
LinkedList(연결)
|
느리다
|
빠르다
|
- 데이터가 많은수록 접근성 저하
|
데이터의 개수가 변하지 않는 경우 - ArrayList
데이터의 개수의 변경이 잦은 경우 - LinkedList
'IT > JAVA' 카테고리의 다른 글
| Collection Framework - Map / JAVA (0) | 2026.01.05 |
|---|---|
| Collection Framework - Set / JAVA (0) | 2026.01.01 |
| Stack, Queue / JAVA (0) | 2026.01.01 |
| Session, Cookie, JWT (0) | 2025.11.24 |