우리가 처음 배운 배열은 이런 특징이 있었어.
int[] arr = new int[5];
✔ 한 번 크기를 정하면 변경 불가
✔ 인덱스로 접근
✔ 메모리에 연속된 공간 확보
배열은 저장공간을 한 번에 관리하기 좋았다.
하지만…
❗ 게시글이 몇 개 생성될지 모른다면?
❗ 사용자 데이터가 몇 개 들어올지 모른다면?
배열은 불편해진다.
ArrayList는 배열의 단점을 보완한 동적 배열(Dynamic Array) 이다.
import java.util.ArrayList;
ArrayList<Integer> arrList = new ArrayList<>();
원소 추가
arrList.add(10);
arrList.add(20);
배열처럼 arr[0] = 10; 이렇게 직접 넣지 않는다.
값 가져오기
arrList.get(0);
특정 값의 인덱스 찾기
arrList.indexOf(20);
✔ 값이 없으면 -1 반환
현재 저장된 원소 개수
arrList.size();
배열의 length와 비슷하지만
ArrayList는 size() 메서드를 사용한다.
여기 진짜 중요하다.
arrList.remove(1);
이 코드는 값 1을 지우는 게 아니라
👉 인덱스 1번을 지운다.
왜냐하면?
ArrayList에는 remove가 두 가지가 있기 때문이다.
remove(int index) // 인덱스로 삭제
remove(Object o) // 값으로 삭제
그런데 ArrayList<Integer>에서
arrList.remove(10);
이렇게 하면?
컴파일러는
10을 int로 인식 → index로 판단
그래서 에러가 나거나 엉뚱한 요소가 지워진다.
값으로 삭제하고 싶다면 반드시 이렇게 써야 한다.
arrList.remove(Integer.valueOf(10));
✔ int → Integer 객체로 변환
✔ remove(Object o) 메서드 호출
✔ 값 기준 삭제 성공
자바는 메서드 오버로딩을 사용한다.
같은 이름이지만 매개변수가 다르면 다른 메서드다.
remove(int index)
remove(Object o)
정수 리터럴을 넣으면 기본형 int이기 때문에
자동으로 index 버전이 선택된다.
✔ 게시글 개수를 모를 때
✔ 사용자 목록 관리
✔ DB 조회 결과 저장
✔ API 응답 리스트 처리
실무에서는 데이터 개수가 고정되어 있지 않다.
그래서 대부분:
List<DTO> list = new ArrayList<>();
형태를 많이 쓴다.
| 구분 | 배열 | ArrayList |
|---|---|---|
| 크기 | 고정 | 가변 |
| 타입 | 기본형 가능 | 객체만 가능 |
| 길이 확인 | length | size() |
| 삭제 | 직접 구현 | remove() |
배열은 고정된 저장공간
ArrayList는 늘어나는 저장공간
그리고 진짜 중요한 것 👇
🔥
ArrayList<Integer>에서 remove(숫자)는 인덱스 삭제다.
값 삭제는 반드시Integer.valueOf()사용!