array VS List

실무할때 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)**를 사용하지만, 성능이 중요한 경우에는 배열을 고려할 수 있습니다.