[Java] 1. Array vs ArrayList

김민주·2025년 3월 21일

Programming Language

목록 보기
5/12
post-thumbnail

💬 한 줄 요약

고정된 데이터면 Array, 동적 변화 많으면 ArrayList!

Array (=배열)

  • 고정 크기 (Static Size)
    int[] arr = new int[5];
  • 배열의 길이를 .length로 가져옴 (메서드 아니고 필드)
    System.out.println(numbers.length); // 5

👍 장점

  • Primitive 타입 데이터 저장 가능
  • 메모리 연속 공간에 저장되어 효율이 좋고, 속도 빠름

👎 단점

  • 동적 데이터 추가 불가능

📌 코드 예시

int[] numbers = new int[5];
numbers[0] = 10;
numbers[1] = 20;
System.out.println(numbers[0]); // 출력: 10

ArrayList

  • 가변 크기 (Dynamic Size)
    ArrayList<String> list = new ArrayList<>();
    ArrayList는 Collection 구조 안에 들어감

👍 장점

  • 저장 공간이 자동으로 늘어나며 관리가 편리함
  • 내부적으로 배열로 구현되어 있어 조회(검색) 속도가 빠름

👎 단점

  • 오직 Reference Type만 저장 가능 (Wrapper 사용)

Reference Type이란?
"값이 아니라 주소를 저장하는 타입"
✔ Primitive Type (기본형): int, double, char, boolean
✔ Reference Type (참조형): Object(Integer, Array, String, ArrayList, 커스텀 클래스 등)

int a = 10;            // Primitive → 값 자체 저장
String str = "Hello";  // Reference → "Hello"가 있는 메모리 주소 저장

Wrapper Class란?
기본형을 객체처럼 감싸는 클래스
intInteger, doubleDouble, charCharacter
ArrayList 같은 객체 저장 공간에 넣으려면 무조건 이걸로 변환해야 함

Integer b = 10;  // int 10을 감싼 객체
// int는 값이라서 주소 없음 (저장 불가), Integer는 객체라서 주소 존재 (저장 가능)
ArrayList<Integer> list = new ArrayList<>();
list.add(b);
ArrayList<Integer> list = new ArrayList<>();
list.add(10);  // int 넣었지만 → Integer로 자동 변환됨 (Auto-boxing)

왜 이게 단점인가?

ArrayList<Integer> list = new ArrayList<>();
for (int i = 0; i < 1000000; i++) {
    list.add(i);  // 매번 Integer로 감싸는 작업 발생 (Auto-boxing)
}

→ 이런 연산이 엄청 많아지면, 배열에 직접 담는 것보다 느림
Primitive 데이터가 매우 많고, 성능이 중요한 상황에서는 단점 맞음!

📌 코드 예시

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;

public class ArrayListExample {
    public static void main(String[] args) {

        /* 📌 선언 */
        ArrayList<Integer> list1 = new ArrayList<Integer>();                       // 방법 1
        ArrayList<Integer> list2 = new ArrayList<>();                              // 방법 2 (생략형)
        ArrayList<Integer> list3 = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5));  // 방법 3 (초기값 세팅)

        /* 📌 추가 */
        list1.add(6);

        /* 📌 제거 */
        list3.remove(0); // index로 제거 (0번 인덱스 제거)
        // list3.remove(Integer.valueOf(3)); // 값으로 제거하고 싶을 때

        /* 📌 대체 */
        list3.set(1, 99); // index 1의 값을 99로 변경

        /* 📌 정렬 */
        Collections.sort(list3); // 오름차순 정렬

        /* 📌 출력 예시 */
        System.out.println(list3);

        // 그 외, String처럼 다룰 수 있음 (get, contains, isEmpty 등)
        if (list3.contains(99)) {
            System.out.println("99가 리스트에 있음!");
        }
    }
}

Array vs ArrayList

구분ArrayArrayList
크기고정가변
데이터 타입Primitive / ReferenceReference(객체) Only
속도빠름상대적으로 느림 (내부적으로 배열 관리)
기능성단순 저장추가, 삭제, 검색 등 다양한 메서드 지원
사용 예시데이터 개수가 명확하고 변하지 않을 때데이터가 자주 추가/삭제될 때

✅ 마무리

Array와 ArrayList는 용도에 따라 선택하는 게 핵심!

정적, 속도 중시 → Array
동적, 기능성 중시 → ArrayList

🎯 Mini Quiz

아래 상황에서 Array vs ArrayList 중 어떤 걸 쓰는 게 맞을까? 그 이유는?

💻 [문제 1]
알고리즘 문제에서 100만 개의 숫자를 저장하고,
매번 특정 인덱스의 값을 빠르게 읽어야 한다.
추가/삭제는 전혀 없고 읽기만 계속 한다.

💻 [문제 2]
사용자 입력으로 회원 이름을 계속 추가해야 한다.
이후 특정 이름이 있는지 검사하고, 삭제도 해야 한다.
저장 개수는 정해져 있지 않다.

📝 정답

문제정답이유
1번Array크기 고정 & 읽기만 반복 → 배열이 메모리 효율, 속도 모두 좋음
2번ArrayList추가/삭제가 많고, 크기 미정 → ArrayList가 가변적이라 적합

[문제 1] 예시 코드

// 배열 사용 (읽기 성능 최적화)
int[] numbers = new int[1000000];

// 값 저장
for (int i = 0; i < numbers.length; i++) {
    numbers[i] = i;
}

// 빠른 조회 (O(1))
System.out.println(numbers[999999]);

[문제 2] 예시 코드

import java.util.ArrayList;

ArrayList<String> users = new ArrayList<>();

// 이름 추가
users.add("Alice");
users.add("Bob");
users.add("Charlie");

// 검색
if (users.contains("Bob")) {
    System.out.println("Bob is here!");
}

// 삭제
users.remove("Bob");
profile
낭비하지마 네 시간은 은행🐰

0개의 댓글