크기가 자동으로 늘어나는 가변 길이 배열이에요.
ArrayList<Integer> list = new ArrayList<>();
이 한 줄이 뭘 의미하는지 완벽하게 알아봅시다!
ArrayList<Integer> list = new ArrayList<>();
// ↑ ↑ ↑ ↑ ↑
// | | | | └─ 실제 객체 생성
// | | | └────────── new 키워드
// | | └─────────────── 변수 이름
// | └────────────────────── 담을 데이터 타입
// └─────────────────────────────── 자료구조 타입
의미: "Integer(정수)를 담을 수 있는 ArrayList를 만들고, list라는 이름으로 사용하겠다"
| 부분 | 설명 |
|---|---|
ArrayList | 가변 길이 배열 (자동으로 크기 조절) |
<Integer> | 정수(Integer)만 담을 수 있음 |
list | 변수 이름 (원하는 이름 사용 가능) |
new ArrayList<>() | 실제로 ArrayList 객체 생성 |
int[] arr = new int[5]; // 크기 5로 고정
arr[0] = 10;
arr[1] = 20;
// ... 5개까지만 가능
// 크기를 바꿀 수 없음!
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<>();
// 처음엔 비어있음: []
list.add(10); // [10]
list.add(20); // [10, 20]
list.add(30); // [10, 20, 30]
// 특정 위치에 추가
list.add(1, 15); // [10, 15, 20, 30]
int first = list.get(0); // 10
int second = list.get(1); // 15
int last = list.get(list.size() - 1); // 30
int size = list.size(); // 4
list.set(0, 100); // 0번 인덱스를 100으로 변경
// [100, 15, 20, 30]
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) |
ArrayList<Integer> numbers = new ArrayList<>();
numbers.add(1);
numbers.add(2);
numbers.add(3);
ArrayList<String> names = new ArrayList<>();
names.add("김철수");
names.add("이영희");
names.add("박민수");
ArrayList<Double> prices = new ArrayList<>();
prices.add(1000.5);
prices.add(2500.0);
prices.add(3999.99);
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<>();
이유: <> 안에는 클래스 타입만 올 수 있어요.
| 기본 타입 | 래퍼 클래스 |
|---|---|
int | Integer |
double | Double |
boolean | Boolean |
char | Character |
long | Long |
float | Float |
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
for(int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
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]
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]
int[] arr = list.stream().mapToInt(i -> i).toArray();
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]
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]
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]
}
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<Integer> result = new ArrayList<>();
for(int num : arr) {
if(num % 2 == 0) {
result.add(num);
}
}
// 크기를 알고 있을 때
int[] arr = new int[5];
| 항목 | 배열 | ArrayList |
|---|---|---|
| 크기 | 고정 | 가변 ⭐ |
| 선언 | int[] arr = new int[5] | ArrayList<Integer> list = new ArrayList<>() |
| 추가 | 불가능 | list.add(값) |
| 접근 | arr[0] | list.get(0) |
| 길이 | arr.length | list.size() |
| 타입 | 기본 타입 가능 | 클래스 타입만 |
| 속도 | 빠름 | 조금 느림 |
ArrayList<Integer> list = new ArrayList<>();
list.add(10);
list.get(1); // ❌ IndexOutOfBoundsException (크기는 1)
list.get(0); // ✅ 10
list.size // ❌ 에러!
list.size() // ✅ 크기 반환
ArrayList<int> list = new ArrayList<>(); // ❌ 에러!
ArrayList<Integer> list = new ArrayList<>(); // ✅
ArrayList<Integer> list = new ArrayList<>();
list.get(0); // ❌ 에러! 비어있음
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;
}
}
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;
}
}
배열에서 5보다 큰 수만 ArrayList에 담으세요.
int[] arr = {3, 7, 2, 9, 1, 5, 8};
// 결과: [7, 9, 8]
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);
}
핵심: 결과 개수를 모를 때는 ArrayList를 사용!