Java | Java에서의 Array, List

BOZZANG·2022년 4월 21일
0

Java

목록 보기
1/2

❕ Array

들어가기 전에, 빠르게 JAVA의 Array API를 훑어보도록 하자

Array의 생성

자료형[] 배열명 = new 자료형 int[n]
int[] numbers = new numbers[5];

Array에 값 넣기

numbers[0] = 10;
numbers[1] = 20;

Array 생성과 동시에 값 넣기

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이다.


🎇 List

앞에서 본 Array의 가장 큰 특징은 Index가 있다는 것이다.
Index를 이용한 데이터의 조회는 매우 빠르게 처리되지만, Index를 통해 데이터를 가져오려면 데이터에 대한 Index값이 고정되어야 한다.
또한 어떤 Element가 삭제되면 삭제된 상태를 빈 공간으로 남겨둬야 한다. 이것은 메모리의 낭비를 초래하며, Array에 데이터의 유무를 확인하는 로직이 필요하다는 의미이기도 하다.

ListArray가 가지고 있는 Index라는 장점을 버리고, 그대신 빈틈 없는 데이터의 적재라는 장점을 취한 Data Structure라고 할 수 있다.

List에서는 Index가 중요하지 않다. List Data Structure의 핵심은 Element들 간의 순서이다. 그래서 List를 다른 말로는 Sequence라고 부르기도 한다. 이는 순서라는 의미이고, 즉, 순서가 있는 데이터의 모임이 List이다.

List

  • 순서가 있는 Element의 모임
  • Element는 허용되지 않는다.
  • 중복된 데이터를 허용한다.

🔗 List Data Structure Operations

 * 처음, 끝, 중간에 Element를 추가/삭제하는 기능
 * 리스트에 데이터가 있는지 체크하는 기능
 * 리스트의 모든 데이터에 접근할 수 있는 기능

위와 같은 기능을 가지고 있고, 순서가 있으면서 중복이 허용된다면 그러한 Data StructureList라고 부른다.


🔗 Java에서의 LIST

List를 직접 구현하는 것도 좋지만, 사용하고 있는 언어에 이미 List가 내장되어있다면 그것은 많은 사람에 의해서 검증된 것이고, 속도도 빠르기 때문에 그것을 사용해야한다. 그런데 모든 언어가 List를 내장하고 있는 것은 아니다.

Java의 경우, ArrayList를 개별적으로 지원한다. 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]

으로 같다.

ArrayListLinkedList의 공통점은 둘 다 List라는 것이다.
차이는 ArrayLinked이다. 이 둘은 사용법이 거의 같고, 실행결과도 같다.
하지만 내부적인 구현방법이 다르다.

Java에서는 왜 ArrayListLinkedList를 동시에 제공할까?
List도 제공하고 Array도 제공하는 이유는 무엇일까?

Java는 Python이나 JavaScript처럼 C 이후에 등장한 언어이나, 두 언어와는 다르게 개발자가 ArrayList 중에 자신의 상황에 맞는 선택을 분명하게 할 수 있도록 이것들을 별도의 기능으로 지원하고 있다.

그렇다면 Java에서 하나의 List를 지원하지 않고 LinkedListArrayList를 둘 다 지원하는 이유는 무엇일까?

이를 알기 위해서는 LinkedListArrayList의 구현 방법을 이해해야 한다.

결론적으로는
Index를 이용해서 데이터를 가져오는 것이 빈번하다면 ArrayList가 빠르다.
데이터의 추가/삭제가 빈번하다면 LinkedList가 빠르다.

처리하고자 하는 데이터에 따라서 어떤 Data Structure를 선택할지를 판단하는 것은 대규모 시스템을 구축하는데 필수적인 능력이다.
이러한 판단을 하기 위해서는 직접 Data Structure를 구현해서 사용하지 않더라도 내부적인 메커니즘을 이해할 필요가 있다.


참고 opentutorials

왜 이것을 배우고 있는가에 대한 의구심을 정리할 수 있게 되었다. 
이유도 모르고 리스트 구현하면서 이걸 내가 왜... 이러고 있었는데 ㅎㅎ 이러한 이유였꾸나... 
그래도 어렵따...💦

0개의 댓글