Array와 List 비교

 

[ Array, List 비교 ]

 

Array, List 비교

Array : 정적으로 연결된 연속된 공간으로 이루어진 자료구조 

 

"공간 크기를 지정해야 한다."

 

Array는 여러개의 연속된 공간을 그룹으로 만들어서 관리하는 자료구조이기 때문에 얼마나 사용할지를 미리 선언해두고 사용해야 한다. 이 특징 때문에, 미리 잡아놓은 공간을 쓰지 않을 경우 공간(메모리)가 낭비되는 경우가 발생하기도 한다.

int[] a = new int[3];

 

List : 동적으로 연결가능한 연속된 공간으로 이루어진 자료구조

 

"공간 크기를 동적으로 사용한다."

 

List는 Array와는 다르게 사용할 공간을 미리 선언해줄 필요가 없다. Array와는 다르게 사용하지 않는 공간이 필요없는 구조이다. 이 특징 때문에, 필요할 때마다 공간을 추가하거나 제거하면서 필요하지 않은 공간(메모리)을 낭비하지 않는다.

List<Integer> a = new ArrayList<Integer>();
List<Integer> a = new LinkedList<Integer>();

 

 

Array, ArrayList, LinkedList 비교

Array와 ArrayList : 배열 구조이며, 인덱스(index)를 사용하는 자료구조

 

"인덱스를 사용한다."

 

Array와 ArrayList는 배열 내의 각 요소의 공간들은 배열을 선언할 때 사용했던 자료형으로 동일한 사이즈의 연속된 공간으로 할당된다. 다시 말해서, 동일한 사이즈의 공간들이 연속되어 있다는 것이다. 배열구조의 이 특징이 인덱스를 사용할 수 있도록 만들어준다. 참고로, Java에서는 ArrayList와 LinkedList가 있는데, 이 중 ArrayList는 Array + List이기 때문에 내부에서는 배열을 사용하고 있어서 인덱스로 접근이 가능한 구조이고, LinkedList는 Linked + List이기 때문에 내부에서 배열을 사용하지 않기 때문에 인덱스로 접근이 불가능한 구조이다.

// Array
int[] a = new int[3];
a[0] = 10;
a[1] = 20;
a[2] = 30;
system.out.println(a[0]);

// ArrayList
List<Integer> a = new ArrayList<Integer>();
a.add(10);
a.add(20);
a.add(30);
system.out.println(a.get(0));

 

ArrayList와 LinkedList : 데이터 추가, 삭제처리가 다른 자료구조

 

"데이터 추가, 삭제가 많다면 ArrayList보다는 LinkedList를 사용한다."

 

ArrayList구조의 변수와 LinkedList구조의 변수에 각각 특정 데이터를 중간에 추가하려고 한다. 이때, ArrayList는 중간에 새로운 데이터를 추가하기 위해, 추가될 위치 뒷부분의 데이터 전체를 한칸씩 뒤로 옮겨야 한다. 반면에, LinkedList는 중간에 새로운 데이터를 추가한다면, 추가될 위치의 바로 앞 데이터의 링크값만 변경시키고 나머지는 그대로 냅두게 된다. 중간의 데이터를 삭제시키는 경우에도 비슷한 상황이 벌어지게 된다. 따라서, 프로그램을 개발할 때, 데이터의 추가와 삭제가 빈번하게 발생하는 처리를 한다면 ArrayList보다는 LinkedList를 사용하는 것이 효율적이다.

 

 

참고

ArrayList java code

http://hg.openjdk.java.net/jdk8/jdk8/jdk/file/tip/src/share/classes/java/util/ArrayList.java

LinkedList java code

http://hg.openjdk.java.net/jdk8/jdk8/jdk/file/tip/src/share/classes/java/util/LinkedList.java