Swift 기초문법 - Collection Type Set 사용하기

Swift Colleciton Type 마지막 Set을 알아봅시다. Set은 수학에서 많이 봐왔던 집합입니다. 집합은 같은 요소를 가질 수가 없고, 집합 안의 순서도 의미가 없습니다. Swift에서도 동일합니다. 즉 고유값만 저장하는 Collection입니다. 중복된 값을 허용하지 않는다는 것이죠. 따라서 각각의 고유한 값을 순서에 대해서 고려할 필요가 없을 때에 Set을 사용 할 수 있습니다.

 

set 집합
Set 집합 예시

 

Set 생성하기

//비어있는 Set 생성
var emptySet1: Set<Int> = []
var emptySet2 = Set<Int>()

//초기화
var set1: Set<Int> = [1, 2, 3, 3, 4, 2]
var set2: Set = [1, 2, 3, 3, 4, 2] 
//Set을 명시 하지 않으면 배열로 인식하게 됩니다.
var set3 = Set<Int>([1, 2, 3, 3, 4, 2])
var set4 = Set<Int>(arrayLiteral: 1, 2, 3, 3, 4, 2)
// 결과 : 1, 2, 3, 4 (출력 순서가 아님)

Set을 생성하는 방법입니다. Set<Type>이 기본 형태입니다. Type에는 Hashable 한 데이터 타입이어야 하며 Swift의 기본 타입은 모두 가능합니다. 형태는 배열과 비슷합니다. 따라서 Set 을 명시하지 않으면 Array로 인식하게 되어있습니다. Set에 초기화된 값을 보면 32가 두 번씩 중복으로 들어가 있습니다. 하지만 할당된 set의 요소를 보게 되면 중복된 값이 없는 걸 볼 수 있습니다.

 

 

Set 요소 추가, 삭제하기

var set1: Set<Int> = [1, 2, 4, 6, 10]
set1.insert(20)

if let removedValue = set1.remove(10) {
	print(removedValue)
} else {
	print("없는 요소 입니다.")
}

insert, remove를 통해서 Set에 요소를 추가 혹은 삭제할 수 있습니다. remove는 삭제한 요소를 반환합니다. 삭제할 요소가 없을 수도 있기 때문에 Optional입니다. 따라서 없을 경우는 nil은 반환합니다.

 

Set for loop(반복문)

var set1: Set<Int> = [1, 2, 4, 6, 10]
for value in set1 {
	print(value)
}

Set 역시 반복문을 통해서 순회할 수 있습니다.

 

Set 집합 연산 하기

Set을 사용하는 큰 이유는 집합 연산때문 이기도 합니다. 문서에는 배열보다 효과적인 멤버십 테스트가 필요할 때에 Set을 사용하라고 되어있습니다. (You use a set instead of an array when you need to test efficiently for membership) 이것이 집합 연산이라고 이해했습니다.

 

C++에도 Set에 있는데요. 이진탐색트리(정렬이 됨) 기반으로 되어있습니다. Swift에서의 내부 구현도 궁금해서 좀 찾아봤는데, 정확한 내용을 찾진 못했습니다. 값이 Hashable 해야 하니 HashTable 기반일 듯합니다. 아마 배열처럼 선형구조는 아니기 때문에 집한 연산에 있어서 유리하다고 생각됩니다.

 

 
var setA: Set<Int> = [1, 2, 4, 6, 10]
var setB: Set<Int> = [1, 3, 4, 7, 12]

print(setA.intersection(setB)) // 교집합
//결과 : [1, 4]
print(setA.union(setB)) // 합집합
//결과 : [1, 2, 3, 4, 6, 7, 10, 12]
print(setA.symmetricDifference(setB)) // 합집합 - 교집합
//결과 : [2, 3, 6, 7, 10, 12]
print(setA.subtracting(setB)) // 여집합
//결과 : [2, 6, 10]
//결과는 출력 순서가 아닙니다.
  • intersection 교집합
  • union 합집합
  • symmetricDifference 대칭차집합(합집합 - 교집합)
  • subtracting 여집합

다른 집합과 교집합, 합집합, 대칭 차집합, 여집합을 쉽게 함수 호출을 통해서 구할 수 있습니다. 

 

정리

이 밖에도 집합을 포함하고 있는지 등의 다른 집합 연산 함수도 구현되어있습니다. 중복이 없는 유니크한 아이템을 관리할 때, 집합 연산이 많이 필요할 때에 Set사용을 고려하면 되겠습니다.



그리드형(광고전용)

이 글을 공유합시다

facebook twitter googleplus kakaoTalk kakaostory naver band

댓글

Designed by JB FACTORY