본문 바로가기

문법

[Swift] Set(집합)과 메서드기능을 알아보자!(feat. HashValue)

- Reference

- https://docs.swift.org/swift-book/LanguageGuide/CollectionTypes.html

 

Collection Types — The Swift Programming Language (Swift 5.6)

Collection Types Swift provides three primary collection types, known as arrays, sets, and dictionaries, for storing collections of values. Arrays are ordered collections of values. Sets are unordered collections of unique values. Dictionaries are unordere

docs.swift.org

- https://developer.apple.com/documentation/swift/set#2845530

 

Apple Developer Documentation

 

developer.apple.com

- https://applecider2020.tistory.com/14

 

[Swift] Hashable 해야 한다? 해쉬값이란? (간단 요약)

안녕하세요. 애플사이다 입니다. Swift Language Guide의 네 번째 챕터 Collection Types에 "Hashable"과 "해쉬값 (Hash Value)"이 등장합니다. 해쉬 개념을 제대로 이해하려면 해쉬 테이블 (Hash Table)이라는..

applecider2020.tistory.com

컬렉션타입의 Set이 있다. 

이는 어떨때 사용할까 ? 공식문서를 참고해보면 첫 문단에서 바로 찾아볼 수 있다.

 

집합은 정의된 순서없이 컬렉션에 동일한 유형의 고유한 값을 지정한다.

항목의 순서가 중요하지 않거나 항목이 한 번만 표시되도록 해야하는 경우 배열 대신 집합을 사용한다.

 

참고로 Swift의 Set 유형은 Foundation의 NSSet 클래스에 연결되며 자세한건 여기서 확인해볼 수 있다.

Hash Value은 모든 객체에 대해 동일한 Int 값이다.

그리고 바로 아래 Set Type은 Hash Value이다. 라는 문구가 있다. Hash Value는 무엇을 말하는 것인가 ?

이 유형은 자체적으로 계산하는 방법을 제공해야하며 Hash Value은 모든 객체에 대해 동일한 Int값이다.

동등하게 비교하는것인데 예시로 if a == b 의 해시값은 b의 해시값과 같다.

 

모든 스위프트의 기본 타입들은 기본적으로 해시가 가능하다. 해시가가능하다는건 

 

해시가 도대체 무엇인가 ?? 알아보자ㅍ

 

해시는 데이터를 간단한 숫자로 변환한 것 이라고 한다.

원본 데이터를 특정 규칙에 따라 처리하여 간단한 숫자로 만든것을 해시값이라고 한다.

정확히는 원본 데이터(객체)를 해쉬 함수(hash fucntion)을 사용하여 64bit의 Int값으로 변환한 것이다.

 

2개의 데이터를 비교할 때, 데이터가 동일하면 각 데이터의 해쉬값도 동일하다. 테스트해보자

- "쿼카"라는 데이터를 담고 있는 quokka 와 quokka2 상수는 값이 동일하다.

- 반면 "해쉬스완" 이라는 상수는 해시 값은 다르다.

- 단, 코드를 컴파일 및 실행할 때마다 모든 해시값이 변경되므로 주의해야한다.

실행 1
실행 2
실행 3

- Hash Value의 값이 실행할때마다 해시값이 변경되므로 주의하자.

 

단, 2개의 서로다른 데이터가 동일한 해쉬값을 가질 수도 있다. 즉, "해쉬값이 동일하면, 2개의 데이터가 동일하다는" 참이 아닐 수 있다.

해시값은 일정 크기의 Int값이므로 유한하고, 데이터 양은 무한하기 때문에 해시값이 충분하지 않기때문이다. 

이 때문에 해시충돌(collision)이 발생한다. 해쉬 추돌은 다른 데이터 구조(연결 리스트, 선형조사법 등)를 사용하여 해결 할 수 있다.

 

해시값은 해시 테이블(Hash Table)이라는 자료구조에서 사용하는 개념이다.

 

자세한 내용은 나중에 더 깊이 알아보도록하자..

 

 


Set은 일련의  수학적 집합 연산을 제공한다.

예를들어 요소의 구성원에 대해 집합을 효율적으로 테스트하거나 다른 집한과의 교차를 확인할 수 있다.

Apple 공식문서를 참고한 Set의 집합연산을 제공하는 메서드들이다.

let numbers: Set<Int> = [1,3,4,8,9,10]
let numbers2: Set<Int> = [4,6,8,10,12,14]
print(numbers.contains(3)) // true
print(numbers == numbers2) // false 비교할 수 있는 이유는 Hashable이 Equatable이라는 비교할 수 있게해주는 프로토콜을 채택하고 있기때문이다.
print(numbers.isSubset(of: numbers2)) // false
print(numbers.isSuperset(of: numbers2)) // false
// 합집합 (단, 중복은 허용하지않는다)
print(numbers.union(numbers2)) // [10, 1, 4, 9, 14, 6, 12, 3, 8]
// 교집합
print(numbers.intersection(numbers2)) // [10, 4, 8]
// 차집합
print(numbers.symmetricDifference(numbers2)) // [9, 1, 6, 12, 3, 14]
print(numbers.subtracting(numbers2)) // [3, 1, 9]

// 고차함수 보너스
// 배열의 값을 순서대로 더한다.
let primesSum = numbers.reduce(0, +)
print(primesSum)
// 배열의 값을 오름차순으로 정렬하고 Int -> String으로 형변환하여 초기화한다.
// String($0)를 할필요도없이 String.init을 해줄 수 있다.
let primeStrings = numbers.sorted().map(String.init)
print(primeStrings)

'문법' 카테고리의 다른 글

[Swift] 타입(Type Casting)캐스팅이란?  (0) 2022.02.22
[Swift] Error Handling[1편] 알아보자!  (0) 2022.02.19
[작성중...] What is the Mutating ?  (0) 2022.02.07
[UI]AVFoundation와 Timer 학습하기  (0) 2022.01.13
[UI] UIkit이란?  (0) 2022.01.13