본문 바로가기
IOS App Programming/Swift

CollectionType 차이점 및 효율적인 사용 시점

by B_Tori 2024. 2. 22.

알고리즘 문제를 풀다 보면 Array, Set, Dictionary 등 Collection Type 데이터들을 다루게 된다.

데이터 타입마다 각각의 특징들을 가지고 있어 같은 작업을 하더라도 효율성이 달라지게 된다.

데이터의 크기가 커질수록 알고리즘의 중요도와 더불어 데이터 타입 선택도 중요해지게 된다.

 

그래서 각 타입들의 특징 및 차이점, 언제 사용하면 좋을지 정리해 보았다.

 

각 데이터 타입의 사용법은 아래 Swift 공식 가이드 참고해 주세요.

https://bbiguduk.gitbook.io/swift/language-guide-1/collection-types

 

각 데이터 타입의 차이점

공식 정의

먼저 Swift language guide에 적혀있는 데이터 타입 설명을 살펴보면 다음과 같다.

배열 (Array)

배열 (array) 은 순서대로 같은 타입의 값을 저장합니다. 같은 값은 배열에 다른 순서로 존재할 수 있습니다.

집합 (Set)

집합 (set) 은 컬렉션에 순서와 상관없이 같은 타입의 다른 값을 저장합니다. 아이템의 순서가 중요하지 않거나 아이템이 반복되면 안 될 때 배열 대신에 집합을 사용할 수 있습니다.

딕셔너리 (Dictionaries)

딕셔너리 (dictionary)는 순서와 상관없이 컬렉션에 같은 타입의 키 (key)와 같은 타입의 값 (value)를 저장합니다. 각 값은 딕셔너리 내부에서 값에 대한 식별자로 동작하는 유니크한 키 와 조합됩니다. 배열의 아이템과 다르게 딕셔너리의 아이템은 특정 순서를 가지고 있지 않습니다. 특정 단어를 찾기 위해 사전을 찾는 방법과 같이 식별자를 기준을 값을 찾을 때 딕셔너리를 사용합니다.

차이점

데이터 타입들을 구분 지을 수 있는 대표적인 차이점은 3가지로 추릴 수 있다.

  1. 데이터 순서
  2. 중복 데이터
  3. 데이터 접근 방식
  배열 집합 딕셔너리
데이터 순서 순서 O 순서 X 순서 X
중복 데이터 데이터 중복 가능 데이터 중복 X 키는 중복X, 값은 중복 가능
데이터 접근 방식 인덱스를 통해 접근 순서가 없어 인덱스를 사용한 접근 불가능 키값을 사용하여 값에 접근

 

즉 각 데이터 타입의 가장 큰 특징을 정리해 보면 다음과 같다.

  • 배열 : 인덱스를 통한 접근
  • 집합 : 순서가 없으며 중복 없는 데이터
  • 딕셔너리 : 키-값 형태의 데이터로 고유한 키 값으로 데이터 접근

 

그렇다면 언제 사용해야 할까?

배열

  • 배열은 인덱스를 통해 빠르게 접근할 수 있고 배열의 크기가 고정되어 있어 메모리 사용량도 예측이 가능하여 효율적이다.
  • 세 개의 데이터 타입 중 유일하게 순서가 존재하기 때문에 순차적인 데이터를 저장하고 접근할 때 효율적이다.
  • 다만 데이터의 추가, 삭제 비용이 많이 발생하기 때문에 데이터 변경이 자주 일어나는 경우 다른 선택지를 고려해봐야 한다.

→ LinkedList 형태로 데이터를 구조화하여 추가, 삭제에 대응하거나 중복 데이터가 중요하지 않은 경우 Set을 사용할 수 있다. LinkedList는 메모리 상에서 연속된 공간이 아니고 연결된 노드의 주소 값을 저장하여 순회하기 때문에 삽입 및 삭제가 더 효율적이다.

집합

  • 중복되지 않은 고유한 요소를 저장하고 관리할 때 유용하다. → 중복된 데이터를 저장하지 않기 때문에 메모리 절약 가능
  • 집합 연산 (합집합, 교집합, 차집합 등)이 가능하기 때문에 특정 상황(공통된 데이터 찾기 등)에서 유용하게 활용할 수 있다.
  • 다만 순서가 없기에 순서가 중요하지 않은 경우에만 사용할 수 있다.

딕셔너리

  • 키 값을 알고 있다면 검색에 가장 효율적이다.
  • 집합과 동일하게 순서가 없기에 순서가 중요하지 않은 경우에만 사용할 수 있다.

 

나는 보통 일반적으로 배열을 기반으로 사용하다가 다음과 같은 조건에 부합하는 경우 데이터 타입을 고민해 본다.

  • 중복이 필요 없을 경우(가짓수 계산 등) 집합 연산이 필요한 경우 → Set 활용
  • 효율적인 검색 및 접근이 필요할 때 (고유한 키값을 만들 수 있는 경우에만) → Dictionary 활용

댓글