들어가기 전에, 빠르게 JAVA의 Array API를 훑어보도록 하자
자료형[] 배열명 = new 자료형 int[n]
int[] numbers = new numbers[5];
numbers[0] = 10;
numbers[1] = 20;
int[] numbers2 = {10,20,30,40};
int[] numbers3 = new int[]{10,20,30,40};
Array
의 선언과 초기화를 따로 진행해야 할 경우Array
를 초기화할 경우)Array
를 전달하면서 초기화해야 할 경우자료형[] 배열명 = new 자료형[]{요소1, 요소2, ...};
만 사용한다. 배열명[index];
자바의 Array
는 기능적으로 한계가 많다. Array
의 크기를 생성할 때 지정하는 것이나, Array
의 크기를 변경할 수 없는 것 그리고 Array
에서 설정된 Element
의 개수를 알아낼 수 없는 것과 같이 불편한 점이 많다.
하지만 데이터의 크기가 확정적일 때 Array
를 사용하는 것이 메모리나 처리속도 면에서 좋다. 또한 Array
는 다른 Data Structure
의 부품이 되기도 한다.
이러한
Array
의 한계를 극복하기 위해서, 조금 더 개선된 기능의Data Structure
를 고안할 필요가 있다. 그런Data Structure
가 바로List
이다.
앞에서 본 Array
의 가장 큰 특징은 Index
가 있다는 것이다.
Index
를 이용한 데이터의 조회는 매우 빠르게 처리되지만, Index
를 통해 데이터를 가져오려면 데이터에 대한 Index
값이 고정되어야 한다.
또한 어떤 Element
가 삭제되면 삭제된 상태를 빈 공간으로 남겨둬야 한다. 이것은 메모리의 낭비를 초래하며, Array
에 데이터의 유무를 확인하는 로직이 필요하다는 의미이기도 하다.
List
는 Array
가 가지고 있는 Index
라는 장점을 버리고, 그대신 빈틈 없는 데이터의 적재라는 장점을 취한 Data Structure
라고 할 수 있다.
List
에서는 Index
가 중요하지 않다. List Data Structure
의 핵심은 Element
들 간의 순서이다. 그래서 List
를 다른 말로는 Sequence
라고 부르기도 한다. 이는 순서라는 의미이고, 즉, 순서가 있는 데이터의 모임이 List
이다.
List
- 순서가 있는
Element
의 모임- 빈
Element
는 허용되지 않는다.- 중복된 데이터를 허용한다.
* 처음, 끝, 중간에 Element를 추가/삭제하는 기능
* 리스트에 데이터가 있는지 체크하는 기능
* 리스트의 모든 데이터에 접근할 수 있는 기능
위와 같은 기능을 가지고 있고, 순서가 있으면서 중복이 허용된다면 그러한 Data Structure
를 List
라고 부른다.
List
를 직접 구현하는 것도 좋지만, 사용하고 있는 언어에 이미 List
가 내장되어있다면 그것은 많은 사람에 의해서 검증된 것이고, 속도도 빠르기 때문에 그것을 사용해야한다. 그런데 모든 언어가 List
를 내장하고 있는 것은 아니다.
Java의 경우, Array
와 List
를 개별적으로 지원한다. Java에서 Array
의 원소를 제거하는 것은 쉽지 않다. 그런 기능이 없기 때문에 직접 구현해야 한다.
대신, Java에서는 List
라는 이름의 Data Structure
를 지원한다.
ArrayList numbers = new ArrayList();
numbers.add(10);
numbers.add(20);
numbers.add(30);
numbers.add(40);
numbers.remove(3);
System.out.println(numbers);
여기서의 이름은 ArrayList
이다.
LinkedList numbers = new LinkedList();
numbers.add(10);
numbers.add(20);
numbers.add(30);
numbers.add(40);
numbers.remove(3);
System.out.println(numbers);
위의 두 코드의 결과는
[10, 20, 30]
으로 같다.
ArrayList
와 LinkedList
의 공통점은 둘 다 List
라는 것이다.
차이는 Array
와 Linked
이다. 이 둘은 사용법이 거의 같고, 실행결과도 같다.
하지만 내부적인 구현방법이 다르다.
Java에서는 왜 ArrayList
와 LinkedList
를 동시에 제공할까?
또 List
도 제공하고 Array
도 제공하는 이유는 무엇일까?
Java는 Python이나 JavaScript처럼 C 이후에 등장한 언어이나, 두 언어와는 다르게 개발자가
Array
와List
중에 자신의 상황에 맞는 선택을 분명하게 할 수 있도록 이것들을 별도의 기능으로 지원하고 있다.
그렇다면 Java에서 하나의 List
를 지원하지 않고 LinkedList
와 ArrayList
를 둘 다 지원하는 이유는 무엇일까?
이를 알기 위해서는 LinkedList
와 ArrayList
의 구현 방법을 이해해야 한다.
결론적으로는
Index
를 이용해서 데이터를 가져오는 것이 빈번하다면ArrayList
가 빠르다.
데이터의 추가/삭제가 빈번하다면LinkedList
가 빠르다.
처리하고자 하는 데이터에 따라서 어떤 Data Structure
를 선택할지를 판단하는 것은 대규모 시스템을 구축하는데 필수적인 능력이다.
이러한 판단을 하기 위해서는 직접 Data Structure
를 구현해서 사용하지 않더라도 내부적인 메커니즘을 이해할 필요가 있다.
왜 이것을 배우고 있는가에 대한 의구심을 정리할 수 있게 되었다.
이유도 모르고 리스트 구현하면서 이걸 내가 왜... 이러고 있었는데 ㅎㅎ 이러한 이유였꾸나...
그래도 어렵따...💦