Back-End/Java
06. 배열과 ArrayList
Yerin Thea Yoo
2026. 2. 11. 23:21
프로그램에서 여러 개의 데이터를 다룰 때 하나의 변수로는 부족하다.
같은 타입의 데이터를 묶어서 관리하는 구조가 필요하다.
그 대표적인 것이 배열과 ArrayList다.
1. 배열(Array)
배열은 같은 자료형의 데이터를 연속된 메모리 공간에 저장하는 구조다.
1) 배열 선언
int[] numbers = new int[5];
- int 타입 데이터 5개 저장
- 크기 5로 고정
2) 배열 초기화
int[] numbers = {1, 2, 3, 4, 5};
3) 배열 접근
배열은 인덱스(index)로 접근한다.
인덱스는 0부터 시작한다.
numbers[0]; //첫 번째 값
numbers[2]; //세 번째 값
4) 배열의 특징
- 크기가 고정됨
- 같은 타입만 저장 가능
- 메모리에 연속적으로 저장
- 빠른 인덱스 접근(O(1))
2. 배열의 메모리 구조
int[] arr = new int[3];
- Stack → arr(참조 변수)
- Heap → 실제 배열 객체 생성
배열도 객체이므로 Heap에 저장된다.
3. ArrayList
ArrayList는 Java에서 제공하는 가변 길이 배열 클래스다.
import java.util.ArrayList;
ArrayList<Integer> list = new ArrayList<>();
1) 특징
- 크기가 자동으로 증가/감소
- 객체만 저장 가능
- 내부적으로 배열 기반으로 동작
2) 주요 메서드
list.add(10); //추가
list.get(0); //조회
list.set(0, 20); //수정
list.remove(0); //삭제
list.size; //크기 확인
4. 배열 vs. ArrayList 비교
| 구분 | 배열 | ArrayList |
| 크기 | 고정 | 가변 |
| 저장 타입 | 기본형 + 참조형 | 객체만 가능 |
| 속도 | 빠름 | 약간 느림 |
| 편의성 | 낮음 | 높음 |
| 패키지 | 기본 | java.util |
5. 왜 ArrayList는 기본형을 못 넣을까?
ArrayList는 제너릭(Generic) 기반 클래스다.
ArrayList<int>; //불가능
ArrayList<Integer>; //가능
기본형(int)은 객체가 아니기 때문에 Wrapper Class(Integer)를 사용해야 한다.
이를 오토 박싱(Auto Boxing)이라고 한다.
6. 내부 동작 원리
ArrayList는 내부적으로 배열을 사용한다.
- 초기 용량 생성
- 데이터 추가
- 용량 초과 시 → 더 큰 배열 생성
- 기존 데이터 복사
그래서 추가 시점에 비용이 발생할 수 있다.
7. 언제 무엇을 써야 할까?
1) 배열을 쓰는 경우
- 크기가 고정
- 성능이 중요
- 메모리 효율 고려
2) ArrayList를 쓰는 경우
- 데이터 개수가 유동적
- 삽입/삭제가 빈번
- 개발 편의성 중요
실무에서는 대부분 ArrayList를 사용한다.