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는 내부적으로 배열을 사용한다.

  1. 초기 용량 생성
  2. 데이터 추가
  3. 용량 초과 시 → 더 큰 배열 생성
  4. 기존 데이터 복사

그래서 추가 시점에 비용이 발생할 수 있다.

 

7. 언제 무엇을 써야 할까?

1) 배열을 쓰는 경우

  • 크기가 고정
  • 성능이 중요
  • 메모리 효율 고려

2) ArrayList를 쓰는 경우

  • 데이터 개수가 유동적
  • 삽입/삭제가 빈번
  • 개발 편의성 중요

실무에서는 대부분 ArrayList를 사용한다.