[Java 컬렉션] Array와 List 컬렉션 완벽 가이드

배열(Array)과 리스트(List)는 Java의 핵심 데이터 구조로, 각각 정적/동적 길이라는 특징을 가집니다. - 추가로 ArrayList 와 LinkedList를 비교해 보겠습니다.



배열 (Array) vs 리스트(List)

배열(Array) 특징과 초기화

  • 고정 길이
  • 연속된 메모리 할당
  • length 속성으로 길이 확인 -> String은 length(), char[]는 length 였음
// 배열 초기화 방법
int[] arr1 = {1, 2, 3};
int[] arr2 = new int[3];
Arrays.fill(arr2, 0);  // 배열 전체 초기화


리스트(List) 특징과 초기화

  • 동적 길이
  • 메모리 할당이 인터페이스 구현체에 따라 다름
    • List는 인터페이스 이고, 이의 대표적인 구현체가 ArrayList, LinkedList가 있음
    • 자세한 내용은 아래 ArrayList vs LinkedList 파트 참고
  • size() 메서드로 길이 확인



ArrayList vs LinkedList

ArrayList

  • 내부적으로 배열 사용 -> 즉, 무작위 접근 가능
    • 배열을 1차로 쓰고, 연결리스트를 2차로 각 배열 인덱스에 연결되어 있는 구조!
  • 랜덤(무작위) 접근 O(1)
  • 삽입/삭제 O(n) -> 배열(연속된 메모리)로 인해 느림
List<String> list = new ArrayList<>();
list.add("apple");
list.get(0);      // 랜덤(무작위) 접근
list.set(0, "banana");  // 값 변경


LinkedList

  • 노드 기반 연결 구조 -> 즉, 무작위 접근 불가능
  • 랜덤 접근 O(n) -> 연결리스트만으로 인해 느림
  • 삽입/삭제 O(1)
List<Integer> list = new LinkedList<>();
list.add(1);          // 끝에 추가
list.addFirst(0);     // 시작에 추가
list.addLast(2);      // 끝에 추가
list.remove(1);       // 인덱스 1 제거



Array ↔ List 변환

// 문자열 배열을 List로 변환
String[] temp = "abcde";
List<String> list = new ArrayList<>(Arrays.asList(temp));

// List를 문자열 배열로 변환
List<String> list = new ArrayList<>();
String[] temp = list.toArray(new String[list.size()]);

// 정수 배열을 List로 변환
int[] temp = { 123, 789, 456 };
List<Integer> list = new ArrayList<>(Arrays.asList(temp));

// List를 정수 배열로 변환
List<Integer> list = new ArrayList<>();
int[] temp = list.stream().mapToInt(i->i).toArray();

// 한번에 초기화하는 fill 메소드 - Arrays, Collections
int[] myArray = new int[10];
Arryas.fill(myArray, 0); // 0으로 init
List<Integer> myList = new ArrayList<>(10);
Collections.fill(myList, null); // null로 init

💡 유용한 팁

  • 중복 검사: list.indexOf(value) < 0 => 중복 없으면 -1 리턴
  • 전체 초기화: Collections.fill(list, value)
  • 스트림 변환: list.stream().mapToInt(i->i).toArray()

상황에 따라 적절한 자료구조를 선택하여 사용하는 것이 성능 최적화의 핵심입니다.

댓글남기기