일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- 앱개발
- Level 1
- 백준온라인저지
- greedy algorithm
- SwiftUI
- error
- dfs
- 프로그래머스
- Python
- 백준 온라인 저지
- 알고리즘 공부
- Clean Architecture
- 알고리즘
- 파이썬 풀이
- Android
- 그리디 알고리즘
- Autolayout
- Swift공부
- BFS
- 정렬
- swift
- ios
- 오토레이아웃
- Algorithm
- 공부
- UIKit
- 파이썬
- Kotlin
- iOS개발
- 안드로이드 공부
- Today
- Total
Tori의 개발 공부
CollectionType 차이점 및 효율적인 사용 시점 본문
알고리즘 문제를 풀다 보면 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가지로 추릴 수 있다.
- 데이터 순서
- 중복 데이터
- 데이터 접근 방식
배열 | 집합 | 딕셔너리 | |
데이터 순서 | 순서 O | 순서 X | 순서 X |
중복 데이터 | 데이터 중복 가능 | 데이터 중복 X | 키는 중복X, 값은 중복 가능 |
데이터 접근 방식 | 인덱스를 통해 접근 | 순서가 없어 인덱스를 사용한 접근 불가능 | 키값을 사용하여 값에 접근 |
즉 각 데이터 타입의 가장 큰 특징을 정리해 보면 다음과 같다.
- 배열 : 인덱스를 통한 접근
- 집합 : 순서가 없으며 중복 없는 데이터
- 딕셔너리 : 키-값 형태의 데이터로 고유한 키 값으로 데이터 접근
그렇다면 언제 사용해야 할까?
배열
- 배열은 인덱스를 통해 빠르게 접근할 수 있고 배열의 크기가 고정되어 있어 메모리 사용량도 예측이 가능하여 효율적이다.
- 세 개의 데이터 타입 중 유일하게 순서가 존재하기 때문에 순차적인 데이터를 저장하고 접근할 때 효율적이다.
- 다만 데이터의 추가, 삭제 비용이 많이 발생하기 때문에 데이터 변경이 자주 일어나는 경우 다른 선택지를 고려해봐야 한다.
→ LinkedList 형태로 데이터를 구조화하여 추가, 삭제에 대응하거나 중복 데이터가 중요하지 않은 경우 Set을 사용할 수 있다. LinkedList는 메모리 상에서 연속된 공간이 아니고 연결된 노드의 주소 값을 저장하여 순회하기 때문에 삽입 및 삭제가 더 효율적이다.
집합
- 중복되지 않은 고유한 요소를 저장하고 관리할 때 유용하다. → 중복된 데이터를 저장하지 않기 때문에 메모리 절약 가능
- 집합 연산 (합집합, 교집합, 차집합 등)이 가능하기 때문에 특정 상황(공통된 데이터 찾기 등)에서 유용하게 활용할 수 있다.
- 다만 순서가 없기에 순서가 중요하지 않은 경우에만 사용할 수 있다.
딕셔너리
- 키 값을 알고 있다면 검색에 가장 효율적이다.
- 집합과 동일하게 순서가 없기에 순서가 중요하지 않은 경우에만 사용할 수 있다.
나는 보통 일반적으로 배열을 기반으로 사용하다가 다음과 같은 조건에 부합하는 경우 데이터 타입을 고민해 본다.
- 중복이 필요 없을 경우(가짓수 계산 등) 집합 연산이 필요한 경우 → Set 활용
- 효율적인 검색 및 접근이 필요할 때 (고유한 키값을 만들 수 있는 경우에만) → Dictionary 활용
'IOS App Programming > Swift' 카테고리의 다른 글
Struct VS Class 메모리 관점 고찰과 언제 써야할까? (1) | 2024.02.28 |
---|---|
접근제한자 정리 및 성능 향상 이유 + final 제한자 (0) | 2024.02.23 |
weak self 를 사용하지 않아도 되는 경우 (2) | 2024.02.07 |
ARC란? - 강한참조와 약한참조, [weak self] (1) | 2024.01.31 |
[Swift] mutating 키워드란? (0) | 2023.05.10 |