hayu's 개발 일지

[TIL]240516 ArrayList 본문

자료구조&알고리즘

[TIL]240516 ArrayList

hayu00 2024. 5. 16. 21:26

ArrayList

  • ArrayList는 배열의 상위 호완 버전 정도의 개념이다.
  • 기존의 배열만으로는 자료를 담고 관리하는데 약간 불편함이 있어서 나온 것이 ArrayList이다.

ArrayList 특징

  • 연속적인 데이터의 리스트이다.(데이터는 연속적으로 리스트에 들어있어야 하며, 중간에 빈 공간이 있으면 안된다.)
  • ArrayList 클래스는 내부적으로 Object[] 배열을 이용하여 요소를 저장한다.
  • 배열을 이용하기 때문에 인덱스를 이용해 요소에 빠르게 접근할 수 있다.
  • 크기가 고정되어 있는 배열과 달리 데이터 적재량에 따라 가변적으로 공간을 늘리거나 줄인다. 그러나 배열의 공간이 가득 찰 때 마다 배열을 copy 하는 방식으로 늘리기 때문에 이 과정에서 지연이 발생하게 된다.
  • 데이터를 리스트 중간에 삽입/삭제 할 경우, 중간에 빈 공간이 생기지 않도록 요소들의 위치를 앞뒤로 자동으로 이동시키기 때문에 삽입/삭제 동작은 느리다.

→ 조회를 많이 하는 경우에 사용하는 것이 좋다.

ArrayList vs 배열

 

배열

  • 처음 선언한 배열의 크기(길이)는 변경할 수 없다. 이를 정적 할당(static allocation)이라고 한다.
  • 데이터 크기가 정해졌을 경우 메모리 관리가 편하다.
  • 메모리에 연속적으로 나열되어 할당하기 때문에 인덱스를 통한 색인(접근)속도가 빠르다.
  • 인덱스에 위치한 하나의 데이터(element)를 삭제하더라도 해당 인덱스에는 빈 공간으로 계속 남는다.
  • 배열의 크기를 변경할 수 없기 때문에, 처음에 너무 큰 크기로 설정해주었을 경우 메모리 낭비가 될 수 있고, 반대로 너무 작은 크기로 설정해주었을 경우 공간이 부족해지는 경우가 발생한다.
        Number[] num = new Number[5]; // 정적 할당(static allocation)
        num[0] = 10;
        num[1] = 20;
        num[2] = 30;
        num[3] = 40;
        num[4] = 50;

        num[3] = null; // 배열은 삭제 메서드가 없어서 null을 이용해 객체 요소를 삭제
        System.out.println(Arrays.toString(num)); // [10, 20, 30, null, 50]

 

ArrayList

  • 리스트의 길이가 가변적이다. 이를 동적 할당(dynamic allocation)이라고 한다.
  • 배열과 달리 메모리에 연속적으로 나열되어 있지 않고 주소로 연결되어 있는 형태이기 때문에 인덱스를 통한 색인(접근)속도가 배열보다는 느리다.
  • 데이터(element) 사이에 빈 공간을 허용하지 않는다.
  • 객체로 데이터를 다루기 때문에 적은 양의 데이터만 쓸 경우 배열에 비해 차지하는 메모리가 커진다.
  • primitive type인 int 타입일 경우 크기는 4Byte 이다.반면에 Wrapper 클래스인 Integer는 32bit JVM 환경에서는, 객체의 헤더(8Byte), 원시 필드(4Byte), 패딩(4Byte)으로 '최소 16Byte 크기를 차지한다. 또한 이러한 객체 데이터들을 다시 주소로 연결하기 때문에 16 + α 가 된다.

→ 래퍼 클래스의 장점은 null 값 허용이다. 원시 타입보다 크기가 크다.

 List<Number> list = new ArrayList<>(); // 동적 할당(dynamic allocation)
        list.add(10);
        list.add(20);
        list.add(30);
        list.add(40);
        list.add(50);

        list.remove(3);
        System.out.println(list); // [10, 20, 30, 50]

 

참고 자료

- https://inpa.tistory.com/entry/JAVA-%E2%98%95-ArrayList-%EA%B5%AC%EC%A1%B0-%EC%82%AC%EC%9A%A9%EB%B2%95

- https://psychoria.tistory.com/765