java - ArrayList

yunzivv·2025년 3월 14일

JAVA 기초

목록 보기
17/23

ArrayList


Array List는 배열(Array)처럼 자료를 연속적으로 담고 같이 제어할 수 있는 자료구조이다. 배열의 단점을 극복하기 위해 사용한다. 단점은 배열보다 어렵다...

더 자세히 알아보자.

1. 특징


  1. ArrayList의 크기는 가변적이다.
    • 크기를 늘리고 줄이기 가능하다.
    • 배열 공간이 꽉 찰 땐 배열을 복사하는 방식으로 늘리기 때문에 지연이 발생한다.
  2. 다양한 타입의 객체를 같이 저장할 수 있다.
  3. 연속적인 데이터의 리스트
    • 중간에 빈공간을 허락하지 않는다.
    • 리스트 중간의 요소를 삽입/삭제 할 경우 요소들의 위치를 자동으로 옮긴다. (시간 소요)
  4. 배열처럼 연속되어 저장되는 것이 아니고, 무작위로 저장된 데이터들이 주소로 연결된 형태로 존재한다.
  5. 배열을 이용하기 때문에 인덱스를 사용해 요소에 빠르게 접근이 가능하다.
  6. 클래스로 존재한다.
    • 패키지를 명시하여 가져와야한다. import java.util.ArrayList;
    • 객체 생성과 같은 방법으로 생성한다.

2. 배열과 차이


아래는 배열과 ArrayList의 차이를 나타내는 표다

배열ArrayList
작성법int[] a = new int[3]ArrayList<> a = new ArrayList<>()
크기한 번 설정한 크기는 변경할 수 없다. (정적할당)크기를 자유롭게 변경할 수 있다. (동적할당)
속도메모리에 연속적으로 저장이 되어있어, 빠르게 접근 가능주소로 연결되어 있어 접근이 배열보다 느리다.
빈공간값을 할당하지 않거나, 중간의 요소를 삭제하면 빈공간으로 남는다.빈공간을 허용하지 않아 삽입, 삭제 시 데이터들이 자동으로 이동
요소같은 타입만 저장다양한 타입의 데이터 함께 저장 가능

3. 생성


// 1. ArrayList 객체 생성 기본 방법
// 변수a에 ArrayList 리모콘 저장

ArrayList<> a = new ArrayList<>();


// 2. ArrayList 객체 생성 타입 설정
// 변수a에 String타입만 저장할 수 있는 ArrayList 리모콘 저장

ArrayList<String> a = new ArrayList<>();


// 3. ArrayList 객체 생성 초기 용량(capacity) 지정
// 변수a에 String타입만 10개 저장할 수 있는 ArrayList 리모콘 저장

ArrayList<String> a = new ArrayList<>(10);

3가지 방식으로 ArrayList를 생성했다.
ArrayList는 초기용량을 지정할 수도 있고, 꺽쇠<>안에 ArrayList의 타입을 지정할 수 도 있다. 저 꺽쇠는 바로 제네릭이다.

3-1. 제네릭

클래스 내부에서 지정하는 것이 아닌 외부에서 사용자에 의해 타입을 지정할 수 있는 키워드다.
위의 코드처럼 ArrayList는 저장할 수 있는 타입이 정해져 있지 않다. ArrayList에 저장할 데이터 타입을 사용자가 클래스 외부에서 제네릭을 통해 지정할 수 있다.

제네릭을 사용하면 타입의 경계를 지정하고 다른 타입이 유입되는 상황을 막을 수 있다. 또, 제네릭을 사용해 미리 타입을 지정하면 컴파일 단계에서 데이터 타입을 미리 체크하기 때문에 캐스팅할 필요가 없어진다.


4. 요소 추가


ArrayList를 생성하고 요소를 추가 할 수 있다. 이 때 ArrayList가 제네릭으로 타입을 명시했다면 명시된 타입의 요소만 추가 가능하다. 또 ArrayList는 빈 공간을 허용하지 않기 때문에 삽입 시 ArrayList의 사이즈보다 큰 인덱스에 빈공간을 건너뛰기하여 추가하는 것은 불가능하다.

4-1. add

가장 기본적인 요소 추가 메서드

ArrayList<String> list = new ArrayList<>();
list.add("A");
list.add("B");

맨 뒤에 요소가 추가된다.
인덱스를 지정해서 추가할 수도 있다.

list.add(1, "C");

해당 위치에 삽입되고, 기존 요소들은 뒤로 밀린다.

4-2. addAll

다른 컬렉션의 모든 요소를 한 번에 추가

ArrayList<String> list1 = new ArrayList<>();
list1.add("A");
list1.add("B");

ArrayList<String> list2 = new ArrayList<>();
list2.add("C");
list2.add("D");

list1.addAll(list2);

지정한 위치에 삽입

list1.addAll(1, list2);

4-3. 요소 삽입

중간 위치에 삽입하면 뒤의 요소들이 한 칸씩 뒤로 이동한다.

list.add(0, "Z");

5. 요소 삭제

5-1. remove

인덱스로 삭제

list.remove(0);

객체로 삭제

list.remove("A");

처음 발견된 해당 객체 하나만 삭제된다.

5-1. removeAll

지정한 컬렉션에 포함된 요소들을 모두 삭제

list.removeAll(list2);

5-1. clear

모든 요소 삭제.
size는 0이 되지만 capacity는 줄어들지 않는다.

list.clear();

6. 요소 접근

get

인덱스로 요소 접근

String value = list.get(0);

subList

리스트의 일부 구간을 잘라서 새로운 리스트처럼 사용

List<String> sub = list.subList(1, 3);

시작 인덱스 포함, 끝 인덱스 미포함


7. 요소 변경

set

특정 위치의 요소를 다른 값으로 변경

list.set(0, "X");

**용량(capacity)** ArrayList의 총 길이. 공간 용량 **크기(size)** ArrayList 안에 담긴 요소들의 갯수

참고 자료


ArrayList
제네릭

0개의 댓글