세트는 말 그대로 공통적인 것들을 묶어놓은 것. 배열과 반대로 순서가 중요하지 않고, 유일한 값들로 채우려고 할 때 세트가 유용하다. 또 세트는 집합으로 활용하기에 좋다.
세트(Set)는 아래 두 가지 차이점을 제외하면 배열(array)과 같은 값의 모음이다.
다음처럼 직접 집합을 만들 수 있다.
let colors = Set(["red", "green", "blue"])
//print = blue, green, red
출력된 주석을 보면 내가 생성한 순서와 일치하지 않는다는 것을 볼 수가 있다. 순서가 지정되지 않는 것이다! 이 처럼 순서가 없기 때문에 배열처럼 요소의 위치를 사용해서 값을 읽을 수 없다.
세트에 중복 항목을 삽입하려고 하면 중복 항목이 무시가 된다.
let colors2 = Set(["red", "green", "blue", "red", "blue"])
//print = green, red, blue
세트 역시 기본적으로 요소를 추가하거나 , 삭제를 할 수 있도록 프로퍼티를 제공하고 있다.
출력 결과!!!!!!
세트와 배열은 모두 데이터 모음이므로 단일 변수 내에 여러 값을 보유한다. 그러나 값을 유지하는 방법이 중요하다.
세트는 순서가 지정되지 않고 중복을 포함할 수 없는 반면 배열은 순서를 유지하고 중복을 포함할 수 있다.
세트는 추가 한 순서대로 개체를 저장할 필요가 없기 때문에 대신 바른 검색을 위해 최적화하는 임의의 순서로 개체를 저장할 수 있다.
이에 비해 배열은 항목을 제공한 순서대로 저장을 해야한다. 따라서 1000개의 항목을 포함하는 배열에 존재하는지 확인하려면 첫번째 항목에서부터 발견될 때까지 모든 항목을 확인해야한다 ...
즉, 큰 차이점은 "이 항목이 있어?"라고 말하고 싶을 때 세트가 더 유용하다. 예를 들어, 단어가 사전에 나타나는지 확인하려면 세트를 사용해야한다. 중복이 없고 빠른 검색을 할 수 있다.
var readings = Set([true, false, true, true])
var ratings = Set([1, 1, 1, 2, 2, 2])
//세트에는 고유한 항목이 포함되어 있어야 하므로 중복된 값들은 삭제됩니다.
let someStrSet:Set = ["ab","bc","cd","de","ab"]
print(someStrSet) //bc, ab, de, cd
// 빈 세트를 생성하는 방법
var names1: Set<String> = Set<String>()
var names2: Set<String> = []
// Array와 마찬가지로 대괄호를 사용한다.
var names3: Set<String> = ["서근", "미진", "철수", "포뇨", "소피아"]
// 타입 추론을 사용하면 컴파일러가 Set가 아닌 Array로 타입을 지정함
var numbers = [100, 200, 300]
print(type(of: numbers)) // Array<Int>
print(names1.isEmpty) // true
print(names3.isEmpty) // false
print(names3.count) // 5
만약 타입 추론을 사용하면 컴파일러가 Set가 아닌 Array로 타입을 지정해주기 때문에 만약 Set를 사용하려면 반드시 Set타입을 지정해줘야 한다.
또 , 세트에 요소를 추가하고 싶다면 Insert( :) 메소드를 , 삭제하고 싶다면 remove( _:)메소드를 사용하는데 메소드를 사용하면 해당 요소가 삭제된 후 반환된다.
var names3: Set<String> = ["서근", "미진", "철수", "포뇨", "소피아"]
names3.insert("캘시퍼")
print(names3) // ["소피아", "철수", "서근", "캘시퍼", "미진", "포뇨"]
names3.remove("미진")
names3.remove("소피아")
print(names3) // ["캘시퍼", "철수", "서근ㅕ", "포뇨"]
print(names3.remove("민지")) // nil
세트는 자신 내부의 값들이 모두 유일함을 보장하므로, 집합 관계를 표현하고자 할 때 유용하게 쓰일 수 있으며, 두 세트의 교집합, 합집합 등을 연산하기에 매우 용이하다. 또한 sorted()
메소드를 통해 정렬된 배열을 반환해줄 수 있다.
let myFavoriteFruits: Set<String> = ["사과", "배", "포도", "메론", "수박"]
let yourFavoriteFruits: Set<String> = ["메론", "수박", "딸기", "참외", "자두"]
// 교집합
let intersectSet: Set<String> = myFavoriteFruits.intersection(yourFavoriteFruits)
print(intersectSet)
// ["메론", "수박"]
// 여집합
let symmetricDiffSet: Set<String> = myFavoriteFruits.symmetricDifference(yourFavoriteFruits)
print(symmetricDiffSet)
// ["사과", "배", "포도", "참외", "자두", "딸기"]
// 합집합
let unionSet: Set<String> = myFavoriteFruits.union(yourFavoriteFruits)
print(unionSet)
// ["자두", "메론", "사과", "포도", "참외", "수박", "배", "딸기"]
// 차집합
let subtracSet: Set<String> = myFavoriteFruits.subtracting(yourFavoriteFruits)
print(subtracSet)
// ["사과", "배", "포도"]
//정렬된 배열을 반환해줌
print(unionSet.sorted())
// ["딸기", "메론", "배", "사과", "수박", "자두", "참외", "포도"]