Array와 Array List

꼬북·2025년 4월 22일

얼마 전부터 자료구조와 알고리즘 부분이 약한 것 같아 복습을 진행하고 있었습니다.
그러던와중, 식은 죽 먹기라고 생각했던 list에서 갑자기 헷갈리는 개념이 생겼습니다.
그건 바로 대체 array와 array list는 어떻게 다르게 바라봐야하는 것인가? 하는 개념이었습니다.

  • 위의 이미지가 나타내는 개념,
  • 파이썬에서의 list는 사실 array list라는 것,
  • array는 동일한 자료형을 연속적으로 저장하지만, list는 여러 자료형을 하나의 묶음으로 하는 순서가 있는 데이터 구조라는 것

이 3가지를 이미 알고 있는데도 문득문득 갑자기 "그래서 array와 list가 뭐가 다른데?"라고 물으면 대답이 선뜻 시원하게 나오질 않았습니다. 그래서 답답한 나머지 두 개의 차이점이 무엇인지 본격적으로 알아보는 시간을 가졌습니다.

돌이켜보면 제가 해당 개념이 헷갈렸던 이유는 자바에서는 array, list, arraylist가 모두 존재하고, 파이썬에서도 array와 list가 구분되어 사용할 수는 있지만 실상 list를 주로 자연스럽게 사용하다보니 딱히 구분할 생각을 하지 않았기 때문이라고 봤습니다. (물론 배웠지만 제가 까먹은 걸 수도..ㅎㅎ)

제가 헷갈렸던 부분은 list와 array의 차이점이었지만, 사실상 list 중에서도 linked list는 메모리 구조나 시간 복잡도 측면에서 array와 뚜렷한 차이가 있어서 쉽게 구분할 수 있었습니다.

따라서 제가 진짜로 헷갈렸던 건 array list와 array의 차이점이었습니다.


그럼 본격적으로 두 자료구조의 차이점을 알아보겠습니다.
우선, array 만의 특징입니다.

📍Array

📌 <특징>

  • 크기가 고정됨 (유연x)
  • 연속된 메모리의 단순 구조라 속도가 더 빠르다.
  • 기본 연산위주로 메서드 사용이 제한적이다.
  • 자바(array) :
    ① 배열의 타입 선언 시, 기본타입(int, double, char 등)과 참조타입(String, Integer, 사용자 정의 등) 모두 사용 가능.
    ② 컴파일 시 선언한 컴포넌트 타입 하나만 허용.
  • 파이썬(array.array) :
    ① 숫자형 타입만 저장 가능하며, 객체 타입(str, 사용자 정의 클래스 등)은 저장 불가.
      (파이썬 내부적으로는 이것들도 int, float 객체지만, array.array는 이 객체의 값을 C 메모리 형식으로 변환해서 저장함.)
    ② 자바와 마찬가지로 하나의 배열에는 한 가지 자료형(동일한 타입)만 저장 가능.

📌 <Array를 주로 사용하는 상황>

  • CPU 캐시 지역성 등 데이터 접근 패턴이 단순 및 연속적이고, 크기가 고정된 경우
  • 크기가 명확하게 정해진 경우



다음은 Array List만의 특징입니다.

📍Array List

📌 <특징>

  • 동적인 크기를 가져, 요소를 추가 및 삭제 시 자동으로 조절함. (유연 O)
  • 동적으로 크기를 조정하다보니 상대적으로 속도가 느린 편이다.
  • 자바 (ArrayList) :
    ① 객체 타입만 저장가능. 기본타입을 저장하고 싶다면, 해당 타입의 래퍼클래스(Integer, Double, Character 등)을 사용해야 함. (→ 자바의 '오토박싱(autoboxing)' 기능 덕에 기본타입을 자동으로 래퍼 객체로 변환해줌.)
ArrayList<Integer> intList = new ArrayList<>(); // int 대신 Integer 사용
intList.add(1); // 오토박싱되어 Integer 객체로 저장
ArrayList<String> strList = new ArrayList<>();  // 객체타입 저장

 ② 마찬가지로 제네릭 타입 파라미터로 지정한 단일 타입만 저장하도록 컴파일러가 강제함. 단, 타입 파라미터를 object로 지정하면 여러 자료형 모두 저장 가능하다. ('list'는 여러 자료형을 저장할 수 있다.')

  • 파이썬 (list):
    ① 자료형의 제한 없이, 어떤 자료형이든 사용 가능
    ② 서로 다른 자료형도 하나의 리스트에 저장가능함!
     (Python의 list는 C언어로 구현되어 있으며, 모든 요소를 PyObject 포인터 배열로 저장하기 때문!)

📌 <Array List를 주로 사용하는 상황>

  • 유연한 크기와 기능이 필요할 경우
  • 삽입/삭제가 빈번한 경우 (→ 사실 이 경우는 주로 Linked List가 유용함.)

위와 같이 Array와 Array List (list) 의 차이점을 알아보았습니다.
그렇다면 두 자료구조의 공통점은 무엇일까요?


📍Array 와 ArrayList의 공통점

  • 순서를 유지함
    : 원소가 삽입된 순서대로 저장됨.
  • 인덱스 기반 접근
    : 인덱스를 이용해 요소에 접근함.
  • 반복문으로 요소를 순회가능함.

📍 마무리

두 자료구조의 공통점과 차이점을 모두 정리해 보니, 확실히 서로 다른 특성을 가지고 있음을 알 수 있었습니다. 일반적으로는 ArrayList, 즉 List를 사용할 일이 더 많지만, 이번 기회를 통해 개념을 명확히 이해하고 사용하는 것이 중요하다는 점을 다시 한번 깨달았습니다.

0개의 댓글