[SWIFT] Set

2021. 1. 28. 02:19SWIFT

반응형

오늘은 SWIFT의 타입 중 Set 타입에 대해 알아보려고 합니다.

 

우선 Set 타입하면 Array 타입과 비슷하다고 생각이 드실거에요.

어떤 부분에서는 비슷하고 선언법도 비슷하죠...?

 

근데 그렇다면 어떤 부분에서 차이점이 존재할까요.

 

바로 Set 타입은 값의 집합이기 때문에, 순서가 중요하지 않아요.

그리고 중복 값을 허용하지 않습니다.

 

또한 중요한 점이 Hashable한 타입만이 선언될 수 있다는 점입니다.

 

구현부를 보면

struct Set<Element> where Element: Hashable

// where 절과 같은 표현입니다
sturct Set<Element: Hashable>

where 절로 Hashable 타입만을 받을 수 있게 한 제약을 확인할 수 있죠..?

 

즉, Set 타입은 순서가 없는 Hashable한 값들의 유일한 집합입니다.

 

그렇다면 지금부터 이 Set 타입을 어떻게 사용하는지 알아보겠습니다.

 

 

생성

var firstSet: Set<String> = []
var secondSet = Set<String>()

다음과 같이 빈 Set<String> 타입을 생성할 수 있습니다.

 

그렇다면 초기 값을 할당하는 Set은 어떻게 생성할 수 있을까요?

var firstSet: Set<String> = ["one", "two", "three"]
var secondSet: Set = ["one", "two", "three"]

이렇게 하면 Set의 생성 당시부터 초기화가 되어 있는 상태로 호출이 가능합니다.

 

근데 여기서 주의해야할 점이 있습니다.

초화를 진행할 때,

var firstSet: Set = ["one", "two", "three"]		// Set
var firstArr = ["one", "two", "three"]			// Array

바로 Array와 Set이 동일한 선언법을 가지고 있기 때문에, Set의 경우에 타입 지정을 해주지 않으면 Array로 초기화가 되어버립니다.

 

그렇다면 여기서 두 변수를 출력하면 어떻게 될까요..?

var firstSet: Set = ["one", "two", "three"]
var firstArr = ["one", "two", "three"]

print(firstSet)
print(firstArr)

/* Print
["two", "three", "one"]
["one", "two", "three"]
*/

이렇듯 Set의 경우에는 순서가 보장되지 않아요.

 

반면 Array는 순서가 확정되서 나오는 것을 확인할 수 있죠?

메모리에 저장되는 방식도 Array의 경우에는 index를 가지고 순서대로 저장이 되지만 Set의 그렇지 않겠다는 것을 알 수 있죠...!!

 

 

값 추가

var firstSet: Set = ["one", "two", "three"]

firstSet.insert("four")

print(firstSet)
// ["one", "three", "four", "two"]

firstSet.update(with: "five")

print(firstSet)
// ["one", "four", "two", "three", "five"]

이렇게 update, insert 두 가지를 이용해서 업데이트 할 수 있는데 아직 차이를 모르겠어요....

 

 

Set 기능

Set에서 제공해주는 기능 중에 여러분들 배웠던 집합에 대한 개념을 활용할 수 있어요..!!

  • intersection : 교집합, 두 겹치는 집합을 활용해 새로운 Set을 만듭니다.
  • symmetricDifference : 겹치는 부분을 제외하고 새로운 Set을 만듭니다.
  • union : 두 집합의 모든 부분으로 새로운 Set을 만듭니다.
  • subtracting : 겹치는 부분을 제외하고 새로운 Set을 만듭니다.
let oddDigits: Set = [1, 3, 5, 7, 9]
let evenDigits: Set = [0, 2, 4, 6, 8]
let singleDigitPrimeNumbers: Set = [2, 3, 5, 7]

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]

이렇게 사용하면 Array와는 또 다르게 Set을 활용해 집합에 대한 개념을 iOS에도 녹일 수 있답니다 🙌

 

 

오늘은 Set 타입에 대해 알아보았는데요 :)

추가 사항이나 잘못된 점은 언제든 말해주세요 ㅎㅎㅎㅎ

반응형