본문 바로가기
부트캠프

자바 기초 스터디 1주차 - Array vs ArrayList

by 데브겸 2023. 10. 25.

자바에서 값을 연속된 공간에 저장할 때는 Array와 ArrayList를 사용할 수 있다.

 

Array

Array(배열)는 동일한 자료형(이때 자료형은 원시 자료형, 객체 모두 가능)의 데이터를 연속된 공간에 저장하기 위한 자료구조. 배열을 구성하는 각각의 값은 요소나 원소(element)라고 불리며, 배열 안에서 특정 요소의 위치는 인덱스(index)라고 지칭한다(파이썬과 달리 인덱스는 0부터 시작하고 양의 정수만 가질 수 있음)

 

가장 큰 특징은 배열을 선언할 때 해당 배열의 크기를 같이 입력해야하고, 이 크기는 이후 변경할 수 없다. 배열을 선언하고 별도의 값을 넣지 않은 인덱스에는 자료형의 기본값(int면 0)이 들어가게 된다.

int[] intArray = new int[3]; // int 자료형을 담을 수 있는 크기 3짜리 배열
int[0] = 1;
int[1] = 2;
int[2] = 3;

int[] intArray = new int[] {1,2,3}; // 위 4줄 코드 결과물과 같음

int[][][] multiArr = new int[3][3][3]; // 다차원적인 표현도 가능

 

장점

- 인덱스로 바로 접근할 수 있으므로 특정 위치의 원소 확인 및 변경이 빠르다

- 값이 연속된 메모리 공간 안에 저장되기 때문에 메모리 관리가 용이함

- Multi-dimensional이 가능하다

 

단점

- 크기가 고정되어 있다는 점 때문에 활용이 다소 까다로울 수 있다

- 사용지 않는 인덱스로 인한 메모리 낭비가 발생할 수 있다

- 원소의 삽입과 삭제를 위해서 모든 인덱스의 원소들의 이동이 필요하다(비효율적)

 

 

 

ArrayList

Collections 프레임워크

JDK 1.2부터 다양한 종류의 컬렉션 클래스와 컬렉션 클래스를 표준화된 방식으로 다룰 수 있도록 체계화하는 Collections 프레임워크가 등장. Collections 프레임워크는 자바의 인터페이스를 사용하며 구현되었으며, 크게 List, Set, Map으로 나뉘어 있다고 볼 수 있음

ArrayList

ArrayList는 중복을 허용하면서 저장순서를 유지해주는 List 인터페이스를 구현하는 클래스이고, Array의 한계점을 극복하기 위해 등장하였음. 내부적으로는 Array를 이용하나, 조금 더 사용자가 사용하기 쉽게 개선하여 Array가 가진 장점을 가져가면서도 더 편리한 사용이 가능해졌다. 가장 큰 특징이자 Array와의 차이점은 (1) 가변적인 저장 공간의 크기와 (2) 중간에 빈 공간을 허용하지 않는다는 것

 

ArrayList<Type> arrayList = new ArrayList<Type>();
ArrayList<Type> arrayList = new ArrayList<Type>(10); // default 크기: 10

 

 

<저장 공간 관련>

위 코드와 같이 선언 때 괄호 안에 크기를 지정할 수는 있지만, 사용자가 데이터를 10보다 더 추가하더라도 에러가 발생하지 않으며 내부적으로 자동으로 크기를 키워준다. 기존 용량의 1.5만큼 크기를 지닌 배열에 기존 배열의 원소들을 복제해주는 방식으로 동작 (새로운 배열 생성과 데이터 복제로 인해 조금 느릴 수 있음. 주의 필요)

 

<중간 빈 공간 비허용 관련>

데이터를 삽입하거나 삭제할 때 연산 이후의 요소 수만큼 딱 맞게 배열의 크기를 조정해준다. 고정된 저장 공간으로 발생하는 메모리 낭비 등의 문제가 해결되는 장점이 존재할 수 있는 반면, 어쨌든 데이터 중간 삽입과 삭제 시 데이터를 옮긴다는 것이기 때문에 연산량이 많아질 수 있다는 단점도 존재한다.

 

<타입, 제네릭 관련>

기존 배열과 달리 ArrayList에서는 제네릭을 사용할 수 있다. 기본적으로 Object배열(Object[])을 이용해서 데이터를 순차적으로 저장하지만 제네릭을 사용하여 특정 타입의 배열로 변경할 수 있다. 단, 이때 원시 자료형은 넣을 수 없고 참조 자료형만 넣을 수 있다. 만약 원시 자료형을 사용하고 싶다면 wrapper class를 사용해야 함(int -> Integer). 

 

 

장점

- 내부적으로는 Array로 구현되어 있기 때문에 Array의 장점(인덱스의 사용 등)을 대부분 취할 수 있다

- Collections 프레임워크가 제공하는 다양한 메서드들을 사용하여 체계적으로 효율적으로 자료형을 다룰 수있다 (✩)

- 저장 공간의 크기를 사용자가 신경쓸 필요 없다 (그래도 주의는 해야 하고, 넉넉하게 선언해야 함) (✩)

- 중간에 원소를 삽입, 삭제가 Array에 비해 비교적 쉽다

- 중간에 빈 공간이 없도록 조정해주기 때문에 메모리 공간의 낭비가 없다

- 제네릭을 이용해 type-safe하게 사용할 수 있다

 

단점

- 데이터의 추가와 삭제에서 어쨌거나 데이터를 옮기기 때문에 그렇게 효율적이진 않다

- multi-dimensional이 안 되고 오직 single-dimensional만 가능

 

 

 

결론

- Array의 대부분의 장점을 ArrayList가 계승하기 때문에 Array를 쓸 대부분의 상황(데이터에 대한 접근이 빈번하고, 삽입 삭제가 많지 않은 경우 등등)에서 ArrayList를 사용하는 것이 좋다.

- 다만, 원시 자료형을 반드시 사용해야 하거나 Multi-dimensional하게 배열을 사용해야 하는 경우에는 Array를 택하여 사용한다.