실무할때 array 랑 list쓸 일이 거의 없어서 까먹었었음
보통은 arrayList 나 HashMap을 List로 선언해서 썼어서 그런듯
Java에서 **배열(Array)**과 **리스트(List)**는 데이터를 저장하고 관리할 때 사용되지만, 용도와 동작 방식에서 많은 차이점이 있습니다. 각각의 특징과 차이점을 비교해 드리겠습니다.
📌 1. 선언과 초기화
배열 (Array)
java
복사편집
// 크기가 5인 정수형 배열 선언 및 초기화
int[] array = new int[5];
// 값이 초기화된 배열 선언
String[] strArray = {"apple", "banana", "cherry"};
- 고정 크기: 배열의 크기를 설정하면 변경할 수 없습니다.
- 모든 타입을 사용할 수 있습니다. (int, String, Object 등)
리스트 (List)
java
복사편집
import java.util.ArrayList;
import java.util.List;
// 문자열을 저장할 수 있는 ArrayList 선언
List<String> list = new ArrayList<>();
// 값 추가
list.add("apple");
list.add("banana");
list.add("cherry");
- List는 인터페이스이며, 보통 ArrayList, LinkedList 등의 구현체를 사용합니다.
- 동적 크기: 요소를 추가하거나 삭제할 때 크기가 자동으로 조정됩니다.
- *객체(Object)**만 저장할 수 있습니다. (int, char와 같은 기본형은 사용 불가, 대신 Integer, Character 사용)
📌 2. 크기 조정
배열
java
복사편집
int[] array = new int[3];
array[0] = 1;
array[1] = 2;
array[2] = 3;
// 배열의 크기를 늘리려면 새 배열을 만들어야 함
int[] newArray = new int[5];
System.arraycopy(array, 0, newArray, 0, array.length);
- 크기를 변경할 수 없습니다.
- 배열의 크기를 늘리거나 줄이려면 새 배열을 생성하고 복사해야 합니다.
리스트
java
복사편집
List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
// 요소 추가
list.add(4); // 자동으로 크기 증가
// 요소 삭제
list.remove(1); // 인덱스 1의 요소 제거 (값 2)
- add(), remove() 메서드를 통해 크기가 자동으로 조정됩니다.
- 필요에 따라 메모리를 자동으로 재할당합니다.
📌 3. 데이터 접근
배열
java
복사편집
String[] strArray = {"apple", "banana", "cherry"};
System.out.println(strArray[1]); // "banana" 출력
- 인덱스를 사용해 빠르게 접근할 수 있습니다.
- array[index] 형태로 사용 (index는 0부터 시작)
리스트
java
복사편집
List<String> list = new ArrayList<>();
list.add("apple");
list.add("banana");
list.add("cherry");
System.out.println(list.get(1)); // "banana" 출력
- get(index) 메서드를 사용해 접근합니다.
- 인덱스 기반으로 접근할 수 있으며, 동적으로 요소를 추가/삭제할 수 있습니다.
📌 4. 성능 비교
기능 배열 (Array) 리스트 (List)
접근 속도 | 빠름 (O(1)) | 빠름 (O(1)) |
추가 속도 | 느림 (O(n), 새 배열 필요) | 빠름 (O(1) 평균) |
삭제 속도 | 느림 (O(n)) | 빠름 (O(n)) |
메모리 사용 | 고정 크기, 효율적 | 동적 크기, 메모리 추가 사용 |
- 배열은 고정 크기이므로, 메모리 사용량이 예측 가능합니다.
- 리스트는 동적 크기이므로 메모리를 효율적으로 사용하지만, 재할당이 필요할 때 성능이 저하될 수 있습니다.
📌 5. 주요 기능 비교
기능 배열 (Array) 리스트 (List)
초기화 방법 | new Type[size] | new ArrayList<>() |
크기 확인 | array.length | list.size() |
요소 추가 | 불가능 (새 배열 필요) | list.add(value) |
요소 삭제 | 불가능 (새 배열 필요) | list.remove(index) |
요소 수정 | array[index] = value | list.set(index, value) |
포함 여부 확인 | 수동 검색 필요 (for문) | list.contains(value) |
정렬 | Arrays.sort(array) | Collections.sort(list) |
📌 언제 사용해야 할까?
- *배열 (Array)**을 사용해야 하는 경우:
- 크기가 고정되어 있고, 빠른 접근이 필요한 경우
- 메모리를 효율적으로 사용해야 하는 경우
- 다차원 배열 (int[][] matrix)이 필요한 경우
- *리스트 (List)**을 사용해야 하는 경우:
- 동적으로 크기가 변하는 데이터를 처리할 때
- 추가, 삭제가 빈번하게 일어날 때
- 다양한 편의 메서드 (add, remove, contains, sort)가 필요할 때
✅ 결론
- 배열은 단순하고 빠르지만 크기 조정이 어렵습니다.
- 리스트는 유연하고 기능이 많지만, 메모리 사용이 더 많을 수 있습니다.
- 실무에서는 대부분 **리스트(ArrayList, LinkedList)**를 사용하지만, 성능이 중요한 경우에는 배열을 고려할 수 있습니다.
'JAVA' 카테고리의 다른 글
자바 리플렉션 (Reflection)을 이해해보자 (1) | 2025.02.07 |
---|---|
JAVA 메모리 - 자바 가상머신 스택과 네이티브 메서드 스택 (2) | 2024.12.14 |
JAVA 메모리 - 프로그램 카운터 레지스터에 대한 이해 (0) | 2024.12.14 |
JAR , WAR (0) | 2024.08.23 |
JAVA - 객체지향에서의 디자인패턴 (0) | 2024.06.04 |