Swift - Set(세트)

내승현·2023년 11월 27일
0

Swift

목록 보기
10/14

세트는 말 그대로 공통적인 것들을 묶어놓은 것. 배열과 반대로 순서가 중요하지 않고, 유일한 값들로 채우려고 할 때 세트가 유용하다. 또 세트는 집합으로 활용하기에 좋다.

세트(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())
// ["딸기", "메론", "배", "사과", "수박", "자두", "참외", "포도"]
profile
아토언니의 프론트엔드 개발자로서의 기록

0개의 댓글