Array
Array(배열)의 특징
- Array는 static한 자료구조. 즉, 자료구조의 길이가 고정되어 있다.
- Array를 선언할 때 초기값을 할당하지 않으면, 배열의 크기만큼 기본값이 채워진다.
- primitive type, reference type 둘 다 저장 가능하다. (ArrayList는 reference type만 가능)
- 다차원 설계가 가능하다.
- 메모리 공간에 연속적으로 저장된다.
- java.util.Arrays 클래스에 구현되어 있는 배열을 지원하는 추가 기능이 존재하기는 하지만, 순수한 배열의 경우에는 특정 원소에 대한 읽기와 쓰기, 배열의 길이에 대한 것만 지원한다.
Array(배열)의 장점
- 인덱스 연산자를 사용할 수 있기 때문에, 특정 원소에 접근하고, 수정하는 시간복잡도가 O(1)이다.
Array(배열)의 단점
- 배열은 선언시 길이가 고정되기 때문에 배열의 크기보다 더 많은 데이터를 저장하기 위해서는 배열을 새로 만들고 배열의 값을 복사해야 하는 불편함이 있음. 이때, 새로운 배열로 데이터를 이동시키는 데에는 O(n)의 시간복잡도가 소요되므로 데이터의 양이 가변적이고 예측하기 어렵다면 배열을 사용하는 것은 권장되지 않는다.
- 배열은 메모리 공간에 연속적으로 저장되기 때문에 중간에 값을 삽입하거나, 삭제하는 경우 상당히 불편하다. 양자 모 기존 배열의 길이보다 길이가 하나 더 크거나 작은 배열을 선언한 후, 새로 모든 데이터를 삽입해야 하기 때문이다.
- 이런 일이 발생할 경우가 많을지는 모르겠지만, 배열은 primitive type, reference type 모두 저장 가능하기 때문에 특정 배열에 null이 추가될 수 있는지 예측하기 어렵다. primitive type은 null을 허용하지 않기 때문에 null 값으로 검증을 하거나 하는 특정 로직을 배열을 통해 구현하면 애를 먹을 가능성이 있다.
ArrayList
ArrayList의 특징
- ArrayList는 내부적으로 배열을 이용해 자료를 저장하는 자료구조이다. 크기가 고정되어 있는 배열의 한계점을 극복하기 위해 고안된 자료구조이다.
- 인덱스로 객체를 관리한다는 부분에서는 배열과 동일하지만, ArrayList는 설정한 저장 용량 크기를 넘긴 객체가 들어오면 배열의 크기를 1.5배로 증가시킨다.
- 내부적으로 배열을 통해 구현이 되어 있기 때문에 원소를 지속적으로 삭제해야 하는 상황에서는 낭비되는 메모리가 많을 수 있다.
- 내부적으로 배열을 통해 구현이 되어 있기 때문에 원소를 지속적으로 이동해야 하는 상황에서는 낭비되는 메모리가 많을 수 있다.
- 이는 ArrayList가 연속된 메모리 공간 내에 할당되기 때문으로, 원소의 이동 혹은 삭제가 잦은 상황에서는 ArrayList보다 LinkedList를 사용하는 것이 권장된다.
ArrayList의 장점
- ArrayList는 인덱스 연산자를 사용할 수 있기 때문에 특정 원소에 접근하고 수정하는 시간복잡도가 O(1)이다.
ArrayList의 단점
- 내부적으로 배열을 통해 구현되므로 원소의 삭제 및 이동에서 많은 메모리 낭비가 일어날 수 있다. 예를 들어 중간의 원소 하나를 삭제하기 위해서는 중간의 원소를 삭제하고 뒤에 위치한 모든 원소를 한칸씩 앞으로 움직일 필요가 있기 때문이다. 중간에 값을 삽입하는 경우에도 마찬가지의 문제에 노출된다.
Array와 ArrayList의 차이점
- Array는 크기가 고정! ArrayList는 크기가 가변!
- Array는 primitive type, reference type 모두 가능! ArrayList는 reference type만 가능!
- Array는 제네릭을 사용할 수 없음! Arrayist는 제네릭을 사용할 수 있음! (타입 안정성 보장 가능)
- Array의 크기는? length! ArrayList의 크기는? size()!
'JAVA' 카테고리의 다른 글
JVM(Java Virtual Machine)이란? (0) | 2022.02.19 |
---|---|
JVM의 Garbage Collector 동작 원리 (0) | 2022.02.14 |
스프링의 역사 | 스프링은 왜 탄생했는가 (2) | 2021.11.07 |
컬렉션 프레임워크(collection framework) 상속 관계 도표 사이트 (0) | 2021.09.23 |
JAVA 문법 : 다형성(Polymorphism) (0) | 2021.09.15 |