1.8 배열과 리스트

yeonseong Jo·2023년 4월 20일
0

SEB_BE_45

목록 보기
10/47
post-thumbnail

Franz Liszt

오늘은 배열에 대해 공부했다.
자바에서 여러 데이터를 담기 위한 자료형이 몇개 있다.
배열(Array)과 리스트(list)가 존재하는데,
두개는 명확한 차이점과 각각 장단점이 존재한다.
이번에는 이 차이점과 장단점을 이야기 하고자 한다.


Array

특징

배열의 가장 큰 특징은 당연히 크기가 정해져 있는거라고 생각된다.
파이썬에서 배열에 대해 알게 되었을 때 크기가 정해진 것이 아니었다.
(물론 파이썬의 배열은 리스트에 가깝다.)

그래서 왜 크기가 정해져 있는지 궁금했는데,
구글링을 해보았지만, 한글로 검색 했을 때 적합한 답을 찾을 수 없었고,
영어로 검색했을 때 역시나 Stack Overflow에 같은 질문을 찾을 수 있었다.
다행히 답변이 있었는데 해당 답변을 요약하자면,
가변 길이 컨테이너를 구현하는 것은 훨씬 더 복잡하다 였다.

답변자가 말한 모든 이유에 대해 다 이해하지는 못했기에
이번에도 GPT의 힘을 빌려보았다.

나:
java에서 배열의 길이는 왜 고정이야?

GPT:
Java에서 배열의 길이는 고정된 크기를 가지는 이유는 배열이 메모리 내에서 연속적인 블록으로 할당되기 때문입니다.
즉, 배열의 크기를 변경하려면 새로운 메모리 블록을 할당하고 기존의 배열 요소를 복사해야합니다.
이 과정은 매우 비싸기 때문에 배열의 크기를 동적으로 변경하는 것은 일반적으로 좋은 방법이 아닙니다.

Java에서는 동적으로 크기가 조정될 수 있는 데이터 구조인 ArrayList와 같은 것을 제공합니다.
ArrayList는 내부적으로 배열을 사용하지만 요소를 추가하거나 제거할 때 자동으로 크기를 조정할 수 있습니다.

따라서 Java에서 배열의 크기는 고정되어 있지만,
ArrayList와 같은 동적 데이터 구조를 사용하면 크기를 동적으로 조정할 수 있습니다.

단번에 이해되었다.
Stack Overflow의 답변인 가변 길이 컨테이너를 구현하는 것이 복잡한 이유를 설명해준거 같다.


장점

  1. 메모리 내에서 연속된 블록으로 할당되므로 빠른 접근 가능

  2. Object class를 통해 다양한 데이터 타입 저장 가능

Object[] arr = new Object[3];
arr[0] = "GPT";
arr[1] = 100;
arr[2] = true;
  1. 깊은 복사 method(clone) 제공
    (list도 구현을 통해 깊은 복사가 가능하긴 하다.)

단점

  1. 특징이고 장점이자 단점인 고정된 크기
  2. 배열 사용전 모든 요소 초기화

List

특징

List는 Array와 다르게 크기가 정해져 있지 않고, 동적으로 변한다.
순서가 있는 데이터들의 집합으로, 불연속적인 메모리 공간에
데이터들이 연관되며 포인터를 통해 각 데이터들이 연결된다.
데이터의 삽입, 삭제가 배열에 비해 용이하고 메모리의 재사용성이 높다.

List를 구현하는 방법엔
ArrayList와 LinkedList가 존재하다.
둘 사이에는 명확한 차이점이 존재하며, 장단점이 있다.

ArrayList

특징

내부적으로 배열을 사용하여 요소를 저장

장점

  • 인덱스를 통해 빠르게 접근 가능하고, 검색에 최적화

단점

  • 데이터의 크기가 변하는 경우 (삽입, 삭제 등) 해당 명령 이후 모든 요소를 이동시켜야 하므로, 속도가 느릴 수 있음

LinkedList

특징

요소가 이전 노드와 다음 노드의 포인터로 연결되어 있음
(head와 tail이 존재)

장점

  • 삽입/삭제 시 명령 위치에서만 수행하면 되기 때문에
    삽입/삭제가 빠름

단점

  • 각 요소에 접근하려 할 때 이전 요소에서 다음 요소로 포인터를 따라가야 하므로 검색 시간이 오래 걸릴 뿐만 아니라,
    요소 하나당 추가로 포인터가 필요하기 때문에 메모리 사용 증가

요약

List의 구현 방법에는 ArrayList, LinkedList방식이 있다.
ArrayList는 검색이 많이 필요한 경우에 유리하며
LinkedList는 삽입/삭제가 많이 필요한 경우에 유리하다.
Array와 달리 여러 데이터 타입의 저장이 불가능하다.
깊은 복사 method가 없어 리스트 안의 모든 요소를 복사하는 방식으로 구현해야 한다.

profile
뒤(back)끝(end)있는 개발자

0개의 댓글