- Reference
- https://docs.swift.org/swift-book/LanguageGuide/CollectionTypes.html
- https://developer.apple.com/documentation/swift/set#2845530
- https://applecider2020.tistory.com/14
컬렉션타입의 Set이 있다.
이는 어떨때 사용할까 ? 공식문서를 참고해보면 첫 문단에서 바로 찾아볼 수 있다.
집합은 정의된 순서없이 컬렉션에 동일한 유형의 고유한 값을 지정한다.
항목의 순서가 중요하지 않거나 항목이 한 번만 표시되도록 해야하는 경우 배열 대신 집합을 사용한다.
참고로 Swift의 Set 유형은 Foundation의 NSSet 클래스에 연결되며 자세한건 여기서 확인해볼 수 있다.
그리고 바로 아래 Set Type은 Hash Value이다. 라는 문구가 있다. Hash Value는 무엇을 말하는 것인가 ?
이 유형은 자체적으로 계산하는 방법을 제공해야하며 Hash Value은 모든 객체에 대해 동일한 Int값이다.
동등하게 비교하는것인데 예시로 if a == b 의 해시값은 b의 해시값과 같다.
모든 스위프트의 기본 타입들은 기본적으로 해시가 가능하다. 해시가가능하다는건
해시가 도대체 무엇인가 ?? 알아보자ㅍ
해시는 데이터를 간단한 숫자로 변환한 것 이라고 한다.
원본 데이터를 특정 규칙에 따라 처리하여 간단한 숫자로 만든것을 해시값이라고 한다.
정확히는 원본 데이터(객체)를 해쉬 함수(hash fucntion)을 사용하여 64bit의 Int값으로 변환한 것이다.
2개의 데이터를 비교할 때, 데이터가 동일하면 각 데이터의 해쉬값도 동일하다. 테스트해보자
- "쿼카"라는 데이터를 담고 있는 quokka 와 quokka2 상수는 값이 동일하다.
- 반면 "해쉬스완" 이라는 상수는 해시 값은 다르다.
- 단, 코드를 컴파일 및 실행할 때마다 모든 해시값이 변경되므로 주의해야한다.
- 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 |