반응형
집합 자료형은 수학에서 배웠던 집합의 개념과 거의 동일하다. 이 때문에 집합 자료형 끼리는 집합 연산을 할 수 있는데, 스위프트에서는 집합끼리의 연산을 쉽게 처리할 수 있도록 여러 가지 메소드를 제공한다.
기본 집합 연산
집합 연산의 결과값은 집합으로 구성되는데, 다음은 두 개의 집합 a와 b의 연산과 그 결과를 그림자 영역을 이용하여 표현하고 있는 그림이다.
그림에서 표현하고 있는 연산과 각 메소드는 모두 4개이다.
- intersection(_:) 양쪽 집합에서 공통되는 데이터만 선택하여 새로운 집합을 만들어주는 메소드, 수학에서 이에 해당하는 연산은 교집합이다.
- symmetricDifference(_:) 양쪽 집합 중에서 어느 한쪽에만 있는 데이터를 선택하여 새로운 집합을 만들어주는 메소드, 양쪽 집합 모두에 공통으로 있는 데이터는 제외한다.
- union(_:) 양쪽 집합에 있는 모든 데이터를 선택하여 새로운 집합을 만들어주는 메소드, 양쪽 집합 중 어느 한쪽에만 있거나 양쪽 집합 모두에 공통으로 있는 데이터를 선택하지만 공통으로 있는 데이터라고 하여 중복해서 추가되지 않는다, 수학에서 이에 해당하는 연산은 합집합이다.
- subtract(_:) 한쪽 집합에 있는 모든 데이터에서 다른 쪽 집합에도 속하는 공통 아이템을 제외하고 새로운 집합을 만들어주는 메소드이다. 주로 한쪽 집합에서 다른 쪽 집합을 빼는 연산으로 처리되며 수학에서 이에 해당하는 연산은 차집합이다.
이 중 subtract(_:) 메소드를 제외하면 나머지 메소드는 모두 양쪽 집합의 위치가 바뀌더라도 결과값이 동일하다.
📝 두 개의 집합 중 어느 것을 객체로 사용하고 다른 하나를 인자값으로 사용하더라도 subtract(_:) 메소드를 제외하면 결과에 차이가 없다는 거지 ✅
// 메소드 사용법, 예제
var oddDigits : Set = [ 1 , 3 , 5 , 7 , 9 ] // 홀수 집합
let evenDigits : Set = [ 0 , 2 , 4 , 6 , 8 ] // 짝수 집합
let primeDigits : Set = [ 2 , 3 , 5 , 7 ] // 소수 집합
oddDigits.intersection(evenDigits).sorted()
// [ ]
oddDigits.symmetricDifference(primeDigits).sorted()
// [ 1 , 2 , 9 ]
oddDigits.union(evenDigits).sorted()
// [ 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 ]
oddDogots.subtract(primeDigits)
oddDigits.sorted()
// [ 1 , 9 ]
부분집합과 포함관계 판단 연산
집합 A와 집합 B의 아이템이 모두 일치할 때 A == B가 성립하며, 이와 동시에 두 집합은 서로의 부분집합이 될 수 있다. 스위프트에서는 집합 자료형에 대해 부분집합 관계를 확인해 주는 메소드를 제공하는데, 아래와 같이 5개의 메소드가 사용된다.
- isSubset(of:) 주어진 집합의 값 전체가 특정 집합에 포함되는지를 판단하여 true, false를 반환한다.
- isSuperset(of:) 주어진 집합이 특정 집합의 모든 값을 포함하는지를 판단하여 true, false를 반환한다. isSubset(of:)와는 반대 상황을 판단하는 것으로 집합이 다른 집합의 상위집합 역할을 하는가에 대한 판단을 담당하는 메소드라 할 수 있다.
- isStrictSubset(of:)와 isStrictSuperset(of:) 주어진 집합이 특정 집합의 부분집합인지 아니면 상위집합인지를 판단하는 역할을 하지만 두 집합이 서로 같은 경우의 결과값이 다르게 반환된다. 두 집합이 서로 일치할 경우 수학적으로는 서로가 서로의 부분집합이자 상위집합이 될 수 있으므로 isSubset(of:), isSuperset(of:) 메소드가 true를 반환하는 반면, isStrictSubset(of:)와 isStrictSuperset(of:) 메소드는 이를 더 엄격하게 판단하여 정확히 부분집합, 또는 상위집합일 때만 true를 반환한다.
- isDishoint(with:) 두 집합 사이의 공통 값을 확인하여 아무런 공통 값이 없을 때 true를, 공통 값이 아니라 하나라도 있으면 false를 반환한다.
// 메소드 사용법, 예제
let A : Set = [ 1 , 3 , 5 , 7 , 9 ]
let B : Set = [ 3 , 5 ]
let C : Set = [ 3 , 5 ]
let D : Set = [ 2 , 4 , 6 ]
B.isSubset(of: A) // true
A.isSuperset(of: B) // true
C.isStrictSubset(of: A) // true
C.isStrictSubset(of: B) // false
A.isDisjoint(with: D) // true
반응형
'메모장' 카테고리의 다른 글
MVC 패턴 (1) | 2023.11.07 |
---|---|
Swift 튜플 (2) | 2023.03.29 |
Swift 집합의 동적 추가와 삭제 (3) | 2023.03.24 |
Swift 집합 순회 탐색 (2) | 2023.03.22 |
Swift 집합 (1) | 2023.03.21 |