Skip to content

Array와 List의 차이점이 무엇인지 설명해주세요. #68

@ujhong7

Description

@ujhong7

Array와 List의 차이점


1. 개념

구분 Array List
정의 고정된 크기의 메모리 블록에 연속적으로 저장되는 데이터 구조 동적 크기의 데이터 구조로, 요소가 연결되어 저장됨
저장 방식 인덱스를 기준으로 요소가 순차적으로 저장됨 요소들이 포인터를 통해 연결됨

2. 주요 차이점

1) 크기

  • Array:
    • 크기가 고정되어 있음. 생성 시 미리 크기를 지정해야 함.
    • 크기 변경이 어렵고, 변경 시 새 배열을 생성해야 함.
  • List:
    • 크기가 동적(dynamic)으로 변함.
    • 요소를 추가하거나 삭제하면 크기가 자동으로 조정됨.

2) 메모리

  • Array:
    • 연속된 메모리 블록에 저장됨.
    • 인덱스를 통해 요소에 빠르게 접근 가능 (O(1)).
  • List:
    • 요소가 개별적으로 저장되고 포인터로 연결됨.
    • 요소 접근 시 포인터를 따라가야 하므로 접근 속도가 느림 (O(n)).

3) 삽입/삭제

  • Array:
    • 삽입/삭제 시 요소를 이동해야 하므로 비효율적임 (O(n)).
    • 배열의 중간에 삽입하거나 삭제할 때 비용이 큼.
  • List:
    • 삽입/삭제가 용이함 (O(1)).
    • 포인터만 변경하면 되므로 중간에 삽입/삭제하는 데 유리함.

4) 메모리 사용 효율

  • Array:
    • 메모리 효율이 높음(추가적인 포인터를 저장하지 않음).
  • List:
    • 각 요소마다 추가적으로 포인터를 저장하므로 메모리 사용량이 큼.

3. iOS에서의 구현

  1. Array:

    • Swift에서 기본적으로 제공하는 Array 타입.
    • 예시:
      var array = [1, 2, 3, 4]
      array.append(5) // 요소 추가
      print(array[2]) // 요소 접근
  2. List:

    • Swift에서는 연결 리스트를 직접 구현해야 함.
    • 예시: 단일 연결 리스트(Singly Linked List)
      class Node {
          var value: Int
          var next: Node?
      
          init(value: Int) {
              self.value = value
          }
      }
      
      class LinkedList {
          var head: Node?
      
          func append(_ value: Int) {
              let newNode = Node(value: value)
              if let head = head {
                  var current = head
                  while current.next != nil {
                      current = current.next!
                  }
                  current.next = newNode
              } else {
                  head = newNode
              }
          }
      }
      
      let list = LinkedList()
      list.append(1)
      list.append(2)

4. 사용 사례

  • Array:

    • 데이터의 크기가 고정적이거나 요소 접근 속도가 중요한 경우.
    • 예: 대규모 데이터 분석, 캐싱.
  • List:

    • 데이터의 크기가 유동적이고 삽입/삭제 작업이 빈번한 경우.
    • 예: 큐(Queue), 스택(Stack) 구현.

5. 결론

  • Array는 고정 크기와 빠른 접근이 필요한 경우 적합.
  • List는 동적 크기와 삽입/삭제 작업이 중요한 경우 유리.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions