
고정된 데이터면 Array, 동적 변화 많으면 ArrayList!
int[] arr = new int[5];System.out.println(numbers.length); // 5👍 장점
👎 단점
📌 코드 예시
int[] numbers = new int[5];
numbers[0] = 10;
numbers[1] = 20;
System.out.println(numbers[0]); // 출력: 10
ArrayList<String> list = new ArrayList<>();👍 장점
👎 단점
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란?
기본형을 객체처럼 감싸는 클래스
int→Integer,double→Double,char→Character
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 | ArrayList |
|---|---|---|
| 크기 | 고정 | 가변 |
| 데이터 타입 | Primitive / Reference | Reference(객체) Only |
| 속도 | 빠름 | 상대적으로 느림 (내부적으로 배열 관리) |
| 기능성 | 단순 저장 | 추가, 삭제, 검색 등 다양한 메서드 지원 |
| 사용 예시 | 데이터 개수가 명확하고 변하지 않을 때 | 데이터가 자주 추가/삭제될 때 |
Array와 ArrayList는 용도에 따라 선택하는 게 핵심!
정적, 속도 중시 → Array
동적, 기능성 중시 → ArrayList
아래 상황에서 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");