[Swift] Collection Type

Seonhu Kim·2023년 4월 15일
0

Swift

목록 보기
2/7
post-thumbnail

코더가 되지 말자.

며칠 전 나의 사수님께서 남기신 엄청난 명언이다.

서버에서 받은 몇개의 데이터를 처리할 일이 있었는데 해당 데이터를 Array에 넣어서 Contains로 처리했다.

사수님이 Array를 쓴 특별한 이유가 있냐고 여쭤보셨고, 나는 데이터가 많으면 효과적으로 처리할 필요가 있다고 생각했을텐데 그럴 필요가 없다고 판단했다.

하지만 사수님께서는 이러한 사소한 습관 하나 하나를 중요하게 생각해야한다고 말씀해주셨다. 서론이 길었지만 이번 주에 가장 큰 깨달음이 있어서 해당 내용을 정리해보고자 한다.

Swift Collection Type

스위프트에는 방대한 콜렉션 타입이 있다. Collection 자체가 프로토콜이다.
내가 비교하려는 Array, Sey, Dictionary의 경우에도 Collection 타입을 채택하고 있다.

  • Array : 순서가 있는 동일한 데이터 타입의 값을 저장할 때 사용, 배열은 인덱스를 통해 값을 접근할 수 있으며, 요소의 추가 및 삭제 가능

  • Set : 순서가 없는 고유한 값을 저장할 때 사용, Set은 값의 중복을 허용하지 않으며, 순서가 없기 때문에 인덱스를 통해 값을 접근할 수 없음

  • Dictionary : 키-값 쌍으로 이루어진 데이터를 저장할 때 사용, 키는 중복될 수 없으며, 각 키는 해당하는 값과 매핑되어 있음

각 타입의 메모리 상관성

Swift에서 데이터를 다룰 때 가장 메모리 효율적인 Collection type은 상황에 따라 다를 수 있다.

  • 만약 데이터를 추가하고 삭제하는 빈도가 적다면, Array가 가장 메모리가 효율적임 Array는 데이터의 인덱스를 통해 빠르게 접근할 수 있으며, 배열의 크기가 고정되어 있기 때문에 메모리 사용량도 예측 가능함

  • 중복된 데이터를 포함하지 않는 경우, Set이 가장 메모리 효율적일 수 있음 Set은 데이터의 유일성을 보장하면서 중복을 제거할 수 있으므로, 중복된 데이터를 저장할 필요가 없는 경우 메모리를 절약 가능

  • 키-값 쌍으로 구성된 데이터를 다룰 때는 Dictionary가 가장 효율적임 Dictionary는 키를 사용하여 데이터에 빠르게 접근할 수 있으며, 키의 유일성을 보장함

Hasable

  1. Hashable은 Swift에서 프로토콜(protocol) 중 하나이며, 이를 채택한 타입은 해시(hash) 값을 계산할 수 있음.

  2. 해시(hash) 값은 큰 데이터 집합을 빠르게 탐색하기 위해 사용되는 기술 중 하나이며, Swift에서는 Set, Dictionary 등에서 데이터를 빠르게 검색하기 위해 해시(hash) 값을 사용합니다.

  3. 해시(hash)란 임의의 크기를 갖는 데이터를 고정된 크기의 값으로 매핑하는 함수. 이때 매핑된 값은 해시 값이라고 하며, 해시 값은 원본 데이터를 대표하는 값으로 사용함.

해시 테이블을 사용한 검색과 일반 검색 기법의 가장 큰 차이점은 시간 복잡도이다. (아마, 사수님은 선형 검색말고, Hash를 가급적 사용하라고 말씀하신 것 같다.)

일반적으로 배열이나 연결 리스트 등을 사용한 검색은 O(n)의 시간 복잡도를 갖는데, 이는 데이터의 크기가 커질수록 검색 시간이 증가하게 되어 비효율적이다.

반면에 해시 테이블을 사용한 검색은 평균적으로 O(1)의 시간 복잡도를 가지며, 해시 테이블에서 검색을 하기 위해서는 데이터의 해시 값을 계산한 후 해당 값이 저장된 버킷(bucket)에 접근하여 데이터를 찾는다. (해시 테이블을 관리하는 데이터 버킷 배열은 동적으로 늘어났다 줄어들 수 있음)

따라서 해시 테이블을 사용한 검색은 대용량 데이터를 빠르게 검색하는 데 유리하며, 일반적으로 배열이나 연결 리스트 등을 사용한 검색보다 훨씬 빠르다.

결론

  • 같은 Collection type 이라도 사용 목적에 따라 다르다.
  • 간단한 데이터라도 한 번 더 생각하고, 효율적으로 데이터를 처리하자.
  • 습관적으로 메모리 효율성을 생각하자
profile
iOS Developer.

0개의 댓글