본문 바로가기

공부 정리

Array vs ArrayList

반응형

개요


Array와 ArrayList의 차이점을 알아보겠습니다. ArrayList는 내부적으로 Array로 구현합니다.

 

 

1. Array는 길이가 고정된 자료구조인 반면, ArrayList는 가변 컬렉션 클래스입니다. Array는 한번 만들어지면 길이를 변경할 수 없지만, ArrayList는 용량이 다 차면 스스로 사이즈를 늘립니다. (엄밀히 말해서 Array는 length이고, ArrayList는 size입니다.)


ArrayList에서 사이즈를 늘리는 것은 성능이 다소 저하됩니다. ArrayList의 내부가 Array로 구현되어 있는데, 새로운 Array를 만들고 이전 값들을 모두 새로운 Array로 복사하기 때문입니다

2. Array에서 Generics를 사용 할 수 없습니다. 타입이 정해져 있으며, 변환할 수 없는 타입을 저장하려고 하면 ArrayStoreException을 던집니다. ArrayList는 타입 안정성을 확보하기 위해 Generics를 사용합니다.

3. ArrayList는 원시 타입을 저장하지 못하고, 객체만 저장할 수 있습니다. Array는 원시타입과 객체 모두 저장 할 수 있습니다. 마치 ArrayList에 원시타입을 저장 할 수 있는 것처럼 보이지만, 사실 Java5에 오토박싱(Autoboxing) 덕분에 원시타입은 자동으로 객체로 형 변환합니다. 

 

ArrayList<Integer> integerList = new ArrayList<Integer>();
//here we are not storing primitive in ArrayList, 
//instead autoboxing will convert int primitive to Integer object
integerList.add(1);

 

Integer를 Generics 타입으로 가지므로 Integer형을 저장해야 하지만, 원시타입인 int를 저장해도 내부적으로 객체인 Integer형으로 오토박싱(Autoboxing)합니다.



4. ArrayList 객체를 생성할 때 사이즈를 정하지 않아도 기본 사이즈값이 있습니다. 물론 사이즈를 정할 수도 있습니다. 하지만 Array 객체를 생성할 때는 강제로 길이를 설정해야 합니다.

 

 

 

  • 객체를 저장할 때 Array와 ArrayList 중 어느 것을 사용하면 될까요?

객체들의 사이즈를 미리 알 수 있다면 Array를 사용하고, 그렇지 않다면 ArrayList를 사용합니다. Array는 제네릭을 지원하지 않기 때문에 제한적입니다. 그리고 예를 들어 String 배열에 Integer 객체를 저장하면  런타임 때 ArrayStoreException를 던집니다. 하지만 ArrayList는 컴파일러가 미리 오류를 알려주며 제네릭을 활용해 다양한 타입을 허용하는 방법이 있습니다.  


참고

Difference between Array vs ArrayList in Java | Java67

반응형