🔥 집합 연산
Swift 에서는 두 개의 집합을 결합하거나, 두 집합이 공통으로 가지고 있는 값을 파악하거나, 두 집합이 동일한 값을 모두, 일부, 또는 전혀 포함하고 있는지 여부를 효율적으로 확인할 수 있습니다.
기본 집합 연산
아래 그림은 a
와 b
라는 두 개의 집합을 나타내며, 다양한 집합 연산의 결과는 음영으로 표시되어 있습니다.
intersection(_:)
메서드를 사용하여 두 집합에 공통된 값만 포함하는 새로운 집합을 생성할 수 있습니다.symmetricDifference(_:)
메서드를 사용하여 두 집합 중 하나에만 속하는 값을 포함하는 새로운 집합을 생성할 수 있습니다.union(_:)
메서드를 사용하여 두 집합의 모든 값을 포함하는 새로운 집합을 생성할 수 있습니다.subtracting(_:)
메서드를 사용하여 지정된 집합에 없는 값만 포함하는 새로운 집합을 생성할 수 있습니다.
예를 들어, 다음과 같이 세 개의 집합을 정의해 보겠습니다.
let oddDigits: Set = [1, 3, 5, 7, 9] // 홀수 숫자 집합 let evenDigits: Set = [0, 2, 4, 6, 8] // 짝수 숫자 집합 let singleDigitPrimeNumbers: Set = [2, 3, 5, 7] // 한 자리 소수 집합
swift
이제 다양한 집합 연산을 수행해 볼까요?
oddDigits.union(evenDigits).sorted() // [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] // 홀수 집합과 짝수 집합의 합집합을 구하고 정렬합니다. oddDigits.intersection(evenDigits).sorted() // [] // 홀수 집합과 짝수 집합의 교집합을 구하고 정렬합니다. (공통 요소 없음) oddDigits.subtracting(singleDigitPrimeNumbers).sorted() // [1, 9] // 홀수 집합에서 한 자리 소수 집합을 뺀 차집합을 구하고 정렬합니다. oddDigits.symmetricDifference(singleDigitPrimeNumbers).sorted() // [1, 2, 9] // 홀수 집합과 한 자리 소수 집합 중 하나에만 속하는 요소로 이루어진 대칭차집합을 구하고 정렬합니다.
swift
집합 연산을 활용하면 두 집합 사이의 관계를 쉽게 파악할 수 있습니다. 예를 들어, 홀수 집합에 짝수 집합의 모든 요소가 포함되어 있는지, 혹은 그 반대인지 확인할 수 있지요.
집합의 포함 관계와 동등 관계
아래 그림은 a
, b
, c
세 개의 집합을 나타내며, 겹치는 영역은 집합 간에 공유하는 요소를 나타냅니다. 집합 a
는 집합 b
의 상위집합(superset)
입니다. 왜냐하면 a
는 b
의 모든 요소를 포함하고 있기 때문이죠. 반대로 집합 b
는 집합 a
의 부분집합(subset)
입니다. 집합 b
와 집합 c
는 서로 서로소(disjoint)
입니다. 왜냐하면 두 집합은 공통 요소를 전혀 공유하지 않기 때문입니다.
- "같음" 연산자(
==
)를 사용하여 두 집합이 모든 값을 동일하게 포함하고 있는지 확인할 수 있습니다. isSubset(of:)
메서드를 사용하여 한 집합의 모든 값이 지정된 집합에 포함되는지 확인할 수 있습니다.isSuperset(of:)
메서드를 사용하여 한 집합이 지정된 집합의 모든 값을 포함하는지 확인할 수 있습니다.isStrictSubset(of:)
또는isStrictSuperset(of:)
메서드를 사용하여 한 집합이 지정된 집합의 부분집합 또는 상위집합이지만 같지는 않은지 확인할 수 있습니다.isDisjoint(with:)
메서드를 사용하여 두 집합이 공통 값을 가지고 있지 않은지 확인할 수 있습니다.
예를 들어 봅시다. 다음과 같이 세 개의 집합을 정의해 보겠습니다.
let houseAnimals: Set = ["🐶", "🐱"] // 집에서 키우는 동물 집합 let farmAnimals: Set = ["🐮", "🐔", "🐑", "🐶", "🐱"] // 농장 동물 집합 let cityAnimals: Set = ["🐦", "🐭"] // 도시 동물 집합
swift
이제 집합 간의 포함 관계와 동등 관계를 확인해 볼까요?
houseAnimals.isSubset(of: farmAnimals) // true // 집에서 키우는 동물 집합은 농장 동물 집합의 부분집합인가요? 네, 맞습니다! farmAnimals.isSuperset(of: houseAnimals) // true // 농장 동물 집합은 집에서 키우는 동물 집합의 상위집합인가요? 네, 맞아요! farmAnimals.isDisjoint(with: cityAnimals) // true // 농장 동물 집합과 도시 동물 집합은 서로소 관계인가요? 네, 두 집합은 공통 요소가 없네요!
swift
이처럼 Swift 의 집합 연산과 관계 메서드를 활용하면, 집합 사이의 관계를 손쉽게 파악하고 원하는 결과를 얻을 수 있습니다. 여러분도 실제 프로그램을 개발할 때 집합의 특성을 잘 활용해 보시기 바랍니다!
farmAnimals ┌───-──────────┐ │ 🐮, 🐔, 🐑 │ │ ┌──--─┐ │ cityAnimals │ │🐶,🐱│ │ ┌─────────────┐ │ └──--─┘ │ │ │ └────-─────────┘ │ 🐦, 🐭 │ │ │ │ │ houseAnimals └─────────────┘ │ ┌─────────────┐ │ │ │ │ │ 🐶, 🐱 │ │ │ │ │ └─────────────┘ │ ▼
text
위 도표는 세 동물 집합 사이의 관계를 시각적으로 보여줍니다. 집에서 키우는 동물은 농장 동물의 부분집합이고, 농장 동물은 집에서 키우는 동물의 상위집합입니다. 그리고 도시 동물은 농장 동물 및 집에서 키우는 동물과는 별개의 집합으로 존재하고 있지요.
이상으로 Swift 에서 집합 연산과 관계를 다루는 방법에 대해 알아보았습니다. 집합은 중복되지 않는 요소들의 모음으로, 포함 관계와 동등 관계를 효율적으로 파악할 수 있다는 장점이 있습니다.