자바[Java]의 꽃, 배열의 확장판 ArrayList

scminy0527·2026년 2월 26일

1. 배열의 한계

우리가 처음 배운 배열은 이런 특징이 있었어.

int[] arr = new int[5];

✔ 한 번 크기를 정하면 변경 불가
✔ 인덱스로 접근
✔ 메모리에 연속된 공간 확보

배열은 저장공간을 한 번에 관리하기 좋았다.

하지만…

❗ 게시글이 몇 개 생성될지 모른다면?
❗ 사용자 데이터가 몇 개 들어올지 모른다면?

배열은 불편해진다.


2. ArrayList란?

ArrayList는 배열의 단점을 보완한 동적 배열(Dynamic Array) 이다.

import java.util.ArrayList;

ArrayList<Integer> arrList = new ArrayList<>();

✔ 특징

  • 크기 자동 확장
  • 원소 추가/삭제 가능
  • 인덱스 기반 구조
  • 객체 타입만 저장 가능 (기본형은 Wrapper 사용)

3. 기본 메서드 정리

🔹 1. add()

원소 추가

arrList.add(10);
arrList.add(20);

배열처럼 arr[0] = 10; 이렇게 직접 넣지 않는다.


🔹 2. get()

값 가져오기

arrList.get(0);

🔹 3. indexOf()

특정 값의 인덱스 찾기

arrList.indexOf(20);

✔ 값이 없으면 -1 반환


🔹 4. size()

현재 저장된 원소 개수

arrList.size();

배열의 length와 비슷하지만
ArrayList는 size() 메서드를 사용한다.


4. 핵심 포인트: remove()의 함정

여기 진짜 중요하다.

arrList.remove(1);

이 코드는 값 1을 지우는 게 아니라

👉 인덱스 1번을 지운다.

왜냐하면?

ArrayList에는 remove가 두 가지가 있기 때문이다.

remove(int index)      // 인덱스로 삭제
remove(Object o)       // 값으로 삭제

그런데 ArrayList<Integer>에서

arrList.remove(10);

이렇게 하면?

컴파일러는 10을 int로 인식 → index로 판단

그래서 에러가 나거나 엉뚱한 요소가 지워진다.


5. 해결 방법

값으로 삭제하고 싶다면 반드시 이렇게 써야 한다.

arrList.remove(Integer.valueOf(10));

intInteger 객체로 변환
✔ remove(Object o) 메서드 호출
✔ 값 기준 삭제 성공


6. 왜 이런 일이 생길까?

자바는 메서드 오버로딩을 사용한다.

같은 이름이지만 매개변수가 다르면 다른 메서드다.

remove(int index)
remove(Object o)

정수 리터럴을 넣으면 기본형 int이기 때문에
자동으로 index 버전이 선택된다.


7. 실무에서 왜 ArrayList를 많이 쓸까?

✔ 게시글 개수를 모를 때
✔ 사용자 목록 관리
✔ DB 조회 결과 저장
✔ API 응답 리스트 처리

실무에서는 데이터 개수가 고정되어 있지 않다.

그래서 대부분:

List<DTO> list = new ArrayList<>();

형태를 많이 쓴다.


8. 배열 vs ArrayList 비교

구분배열ArrayList
크기고정가변
타입기본형 가능객체만 가능
길이 확인lengthsize()
삭제직접 구현remove()

💡 한 줄 정리

배열은 고정된 저장공간
ArrayList는 늘어나는 저장공간

그리고 진짜 중요한 것 👇

🔥 ArrayList<Integer>에서 remove(숫자)는 인덱스 삭제다.
값 삭제는 반드시 Integer.valueOf() 사용!

profile
비전공자에서 시작해 Flutter로 실서비스를 만들었고, 더 깊은 개발을 향해 계속 성장 중인 개발자

0개의 댓글