ArrayList 정리

이윤화·2025년 10월 16일

Java

목록 보기
10/10
post-thumbnail

📌 ArrayList란?

크기가 자동으로 늘어나는 가변 길이 배열이에요.

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

이 한 줄이 뭘 의미하는지 완벽하게 알아봅시다!


문장 해석

ArrayList<Integer> list = new ArrayList<>();
//   ↑        ↑      ↑    ↑        ↑
//   |        |      |    |        └─ 실제 객체 생성
//   |        |      |    └────────── new 키워드
//   |        |      └─────────────── 변수 이름
//   |        └────────────────────── 담을 데이터 타입
//   └─────────────────────────────── 자료구조 타입

의미: "Integer(정수)를 담을 수 있는 ArrayList를 만들고, list라는 이름으로 사용하겠다"

각 부분 설명

부분설명
ArrayList가변 길이 배열 (자동으로 크기 조절)
<Integer>정수(Integer)만 담을 수 있음
list변수 이름 (원하는 이름 사용 가능)
new ArrayList<>()실제로 ArrayList 객체 생성

배열 vs ArrayList

배열 - 크기 고정 ❌

int[] arr = new int[5];  // 크기 5로 고정

arr[0] = 10;
arr[1] = 20;
// ... 5개까지만 가능

// 크기를 바꿀 수 없음!

ArrayList - 크기 자동 조절 ✅

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

list.add(10);   // [10]
list.add(20);   // [10, 20]
list.add(30);   // [10, 20, 30]
list.add(40);   // [10, 20, 30, 40]
// 원하는 만큼 계속 추가 가능! ✨

기본 사용법

생성

ArrayList<Integer> list = new ArrayList<>();
// 처음엔 비어있음: []

추가 (add)

list.add(10);        // [10]
list.add(20);        // [10, 20]
list.add(30);        // [10, 20, 30]

// 특정 위치에 추가
list.add(1, 15);     // [10, 15, 20, 30]

접근 (get)

int first = list.get(0);    // 10
int second = list.get(1);   // 15
int last = list.get(list.size() - 1);  // 30

크기 (size)

int size = list.size();  // 4

수정 (set)

list.set(0, 100);  // 0번 인덱스를 100으로 변경
// [100, 15, 20, 30]

삭제 (remove)

list.remove(1);  // 인덱스 1 제거
// [100, 20, 30]

list.clear();    // 전부 삭제
// []

확인

boolean isEmpty = list.isEmpty();        // 비어있는지
boolean contains = list.contains(20);    // 20이 있는지
int index = list.indexOf(20);            // 20의 인덱스 (-1이면 없음)

주요 메서드 정리

메서드기능예시
add(값)끝에 추가list.add(10)
add(인덱스, 값)특정 위치에 추가list.add(0, 5)
get(인덱스)값 가져오기list.get(0)
set(인덱스, 값)값 변경list.set(0, 100)
remove(인덱스)값 삭제list.remove(0)
size()크기list.size()
clear()전체 삭제list.clear()
isEmpty()비어있는지list.isEmpty()
contains(값)값이 있는지list.contains(10)
indexOf(값)값의 인덱스list.indexOf(10)

다양한 타입 사용

Integer (정수)

ArrayList<Integer> numbers = new ArrayList<>();
numbers.add(1);
numbers.add(2);
numbers.add(3);

String (문자열)

ArrayList<String> names = new ArrayList<>();
names.add("김철수");
names.add("이영희");
names.add("박민수");

Double (실수)

ArrayList<Double> prices = new ArrayList<>();
prices.add(1000.5);
prices.add(2500.0);
prices.add(3999.99);

Boolean

ArrayList<Boolean> flags = new ArrayList<>();
flags.add(true);
flags.add(false);
flags.add(true);

<Integer> vs <int>

❌ 불가능

ArrayList<int> list = new ArrayList<>();  // 에러!
ArrayList<double> list = new ArrayList<>();  // 에러!

✅ 가능

ArrayList<Integer> list = new ArrayList<>();
ArrayList<Double> list = new ArrayList<>();

이유: <> 안에는 클래스 타입만 올 수 있어요.

기본 타입 → 래퍼 클래스

기본 타입래퍼 클래스
intInteger
doubleDouble
booleanBoolean
charCharacter
longLong
floatFloat

순회 (반복)

방법 1: Enhanced for문 (추천) ⭐

ArrayList<Integer> list = new ArrayList<>();
list.add(10);
list.add(20);
list.add(30);

for(int num : list) {
    System.out.println(num);
}
// 출력: 10, 20, 30

방법 2: 일반 for문

for(int i = 0; i < list.size(); i++) {
    System.out.println(list.get(i));
}

방법 3: forEach (Java 8+)

list.forEach(num -> System.out.println(num));

정렬

import java.util.*;

ArrayList<Integer> list = new ArrayList<>();
list.add(5);
list.add(2);
list.add(8);
list.add(1);

// 오름차순 정렬
Collections.sort(list);
// [1, 2, 5, 8]

// 내림차순 정렬
Collections.sort(list, Collections.reverseOrder());
// [8, 5, 2, 1]

배열로 변환

방법 1: 직접 변환

ArrayList<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);

int[] arr = new int[list.size()];
for(int i = 0; i < list.size(); i++) {
    arr[i] = list.get(i);
}
// arr = [1, 2, 3]

방법 2: Stream 사용

int[] arr = list.stream().mapToInt(i -> i).toArray();

💡 실전 예제

예제 1: 짝수만 저장

int[] arr = {1, 2, 3, 4, 5, 6, 7, 8};
ArrayList<Integer> evenList = new ArrayList<>();

for(int num : arr) {
    if(num % 2 == 0) {
        evenList.add(num);
    }
}

System.out.println(evenList);  // [2, 4, 6, 8]

예제 2: 최솟값 제거

int[] arr = {4, 3, 2, 1};
ArrayList<Integer> list = new ArrayList<>();

// 최솟값 찾기
int min = arr[0];
for(int num : arr) {
    if(num < min) min = num;
}

// 최솟값 제외하고 추가
for(int num : arr) {
    if(num != min) {
        list.add(num);
    }
}

System.out.println(list);  // [4, 3, 2]

예제 3: 나눠떨어지는 수만 저장

int[] arr = {5, 9, 7, 10};
int divisor = 5;
ArrayList<Integer> list = new ArrayList<>();

for(int num : arr) {
    if(num % divisor == 0) {
        list.add(num);
    }
}

if(list.isEmpty()) {
    System.out.println(Arrays.toString(new int[] {-1}));
} else {
    Collections.sort(list);
    System.out.println(list);  // [5, 10]
}

예제 4: 중복 제거

int[] arr = {1, 2, 2, 3, 3, 3, 4};
ArrayList<Integer> list = new ArrayList<>();

for(int num : arr) {
    if(!list.contains(num)) {
        list.add(num);
    }
}

System.out.println(list);  // [1, 2, 3, 4]

언제 사용하나요?

✅ ArrayList 사용

  • 결과 개수를 모를 때
  • 중간에 추가/삭제가 필요할 때
  • 동적으로 크기가 변할 때
// 조건에 맞는 값만 저장 (개수를 모름)
ArrayList<Integer> result = new ArrayList<>();
for(int num : arr) {
    if(num % 2 == 0) {
        result.add(num);
    }
}

✅ 배열 사용

  • 크기가 고정되어 있을 때
  • 빠른 접근이 필요할 때
  • 메모리 효율이 중요할 때
// 크기를 알고 있을 때
int[] arr = new int[5];

배열 vs ArrayList 비교

항목배열ArrayList
크기고정가변 ⭐
선언int[] arr = new int[5]ArrayList<Integer> list = new ArrayList<>()
추가불가능list.add(값)
접근arr[0]list.get(0)
길이arr.lengthlist.size()
타입기본 타입 가능클래스 타입만
속도빠름조금 느림

자주 하는 실수

1. 인덱스 범위 초과

ArrayList<Integer> list = new ArrayList<>();
list.add(10);

list.get(1);  // ❌ IndexOutOfBoundsException (크기는 1)
list.get(0);  // ✅ 10

2. size에 괄호 안 붙이기

list.size  // ❌ 에러!
list.size()  // ✅ 크기 반환

3. 기본 타입 사용

ArrayList<int> list = new ArrayList<>();  // ❌ 에러!
ArrayList<Integer> list = new ArrayList<>();  // ✅

4. 빈 리스트에서 get

ArrayList<Integer> list = new ArrayList<>();
list.get(0);  // ❌ 에러! 비어있음

프로그래머스 활용 패턴

패턴 1: 조건 필터링

class Solution {
    public int[] solution(int[] arr, int divisor) {
        ArrayList<Integer> list = new ArrayList<>();
        
        for(int num : arr) {
            if(num % divisor == 0) {
                list.add(num);
            }
        }
        
        if(list.isEmpty()) return new int[] {-1};
        
        Collections.sort(list);
        
        int[] answer = new int[list.size()];
        for(int i = 0; i < list.size(); i++) {
            answer[i] = list.get(i);
        }
        
        return answer;
    }
}

패턴 2: 최솟값 제거

class Solution {
    public int[] solution(int[] arr) {
        if(arr.length == 1) return new int[] {-1};
        
        int min = arr[0];
        for(int num : arr) min = Math.min(min, num);
        
        ArrayList<Integer> list = new ArrayList<>();
        for(int num : arr) {
            if(num != min) list.add(num);
        }
        
        int[] answer = new int[list.size()];
        for(int i = 0; i < list.size(); i++) {
            answer[i] = list.get(i);
        }
        
        return answer;
    }
}

💻 연습 문제

문제 1

배열에서 5보다 큰 수만 ArrayList에 담으세요.

int[] arr = {3, 7, 2, 9, 1, 5, 8};
// 결과: [7, 9, 8]

문제 2

ArrayList의 모든 요소를 2배로 만드세요.

ArrayList<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
// 결과: [2, 4, 6]

정답

// 문제 1
ArrayList<Integer> result = new ArrayList<>();
for(int num : arr) {
    if(num > 5) {
        result.add(num);
    }
}

// 문제 2
for(int i = 0; i < list.size(); i++) {
    list.set(i, list.get(i) * 2);
}

📝 요약

선언과 생성

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

주요 메서드

list.add()        // 추가
list.get(인덱스)     // 접근
list.size()        // 크기
list.remove(인덱스)  // 삭제
list.isEmpty()     // 비어있는지

순회

for(int num : list) {
    System.out.println(num);
}

정렬

Collections.sort(list);  // 오름차순

배열 변환

int[] arr = new int[list.size()];
for(int i = 0; i < list.size(); i++) {
    arr[i] = list.get(i);
}

🔗 관련 개념

  • 배열 (Array)
  • Enhanced for문
  • Collections 클래스
  • 제네릭 (Generic)

핵심: 결과 개수를 모를 때는 ArrayList를 사용!

0개의 댓글