자료구조 및 알고리즘/자료구조

[자료구조]Array와 ArrayList 차이 in Java

benjykim 2018. 8. 8. 16:44
반응형

Java에서의 Array와 ArrayList의 차이를 알아보자.


1. Resizable 

  - Array : Array는 static하다(Data structure의 길이가 고정되어있다). Array를 만든 후 Array의 길이를 마음대로 변경할 수 없다.


  - ArrayList : ArrayList는 사이즈가 dynamic하다. 각각의 ArrayList Object는 ArrayList의 size를 나타내는 'capacity' 인스턴스 변수를 가지고 있다. ArrayList에 요소들이 더해지면 ArrayList의 capacity 또한 자동적으로 늘어난다.



2. Performance 

  - Array와 ArrayList의 성능은 사용자의 Operation에 의존한다.(사용자가 어떻게 사용하느냐에 따라 달라진다)


  - resize() operation : ArrayList의 자동 resize는 성능을 낮출 것이다(old array에서 new array로 요소들을 옮길 때 임시 array를 사용하기 때문에). ArrayList는 resizing하는 동안 내부적으로 Array의 지원을 받는다.(내부적으로 native method인 System.arrayCopy(...)를 사용하기 때문에)


  - add() or get() operation : Array나 ArrayList로 부터 요소를 얻거나 추가할 때는 거의 비슷한 성능을 보인다.



3. Primitives

  - Array : Array는 primitive type 뿐만 Object도 가질 수 있다.


  - ArrayList : ArrayList는 primitive data types(원시 데이터 타입 - int, float, double...)을 가질 수 없다. 오직 Object만을 가질 수 있다.


 - 사람들은 ArrayList가 primitive type을 저장할 수 있다는 오해를 종종 한다. 하지만 그렇지 않다(primitive 타입을 담을 수 없다). 



 다음을 보자.

ArrayList arraylisttoobject = new ArrayList();

arraylisttoobject.add(23);    // try to add 23(primitive)

  - JVM은 Autoboxing(내부적으로 primitive type을 타입에 상응하는 object로 변환해주는 것)을 통해 ArrayList에 Object만 저장되도록 한다. 따라서, 위의 코드는 사실 아래와 같이 수행된다.

arraylisttoobject.add(new Integer(23)); 

// Converted int primitive to Integer object and added to arraylistobject


4. Iterating the values 

  - Array : for loop 아니면 for each loop를 통해 array를 순회할 수 있다.

  

  - ArrayList : iterator를 사용해 ArrayList를 순회할 수 있다. ArrayList 클래스의 iterator에 의해 얻어진 iterators 그리고 listiterator 메소드는 fail-fast하다. (fail-fast 링크 참조)




5. Type-Safety

 - Array : Array는 동종(homogeneous) data structure이다. 따라서 Array는 특정 데이터 타입의 primitives나 특정 클래스의 objects만을 저장한다. 만일 명시된 타입이 아닌 다른 타입을 Array에 저장할 경우 ArrayStoreException이 던져진다.


String temp[] = new String[2];    // creates a string array of size 2

temp[0] = new Integer(12);        // throws ArrayStoreException,

trying to add Integer object in String[]


 - ArrayList : Generics(제네릭스)를 통해 Type-Safety를 보장한다.



6. Length 

  - Array : 각각의 Array object는 Array의 길이를 반환하는 length 변수를 가지고 있다.


Integer arrayobject[] = new Integer[3];

arraylength = arrayobject.length;    // uses arrayobject length variable

  - ArrayList : ArrayList의 length는 size() 메소드를 통해 얻어진다.

ArrayList arraylistobject = new ArrayList();

arraylistobject.add(12);

arraylistobject.size();    // uses arraylistobject size method



7. Adding elements

  - Array : Assign operator를 사용하여 요소를 삽입한다.


  - ArrayList : add() 메소드를 사용하여 요소를 삽입한다.



8. Multi-dimensional

  - Array : 다차원이 가능하다.

Integer addarrayobject[][] = new Integer[3][2];

addarrayobject[0][0] = new Integer(8);


  - ArrayList : 항상 단일 차원이다.




* Similarities Between Array & ArrayList


1) add and get method : Array와 ArrayList는 요소를 추가하거나 가져올 때 비슷한 성능을 보인다.


2) Duplicate elements : 둘 다 중복되는 요소를 저장할 수 있다.


3) Null Values : Null 값을 저장할 수 있고 index를 사용하여 값을 참조할 수 있다.


4) Unordered : 순서를 보장하지 않는다.








*** 이 포스트는 이 곳을 참고하여 작성했습니다. ***



반응형