Swift

[Swift]집단 자료형 - 집합(Set)

느려도천천히 2021. 12. 21. 21:57

집합(Set)

같은 타입의 서로 다른 값을 중복 없이 저장할 때, 사용하는 집단 자료형인 Set
배열과 비슷하지만 데이터들이 중복으로 저장되지 않아 무조건 한 개의 값은 한 개뿐 없습니다

정의

집합을 정의할 때는 초기값을 사용하여 정의하거나 빈 집합을 선언하고 초기화하는 과정을 거쳐 정의할 수 있습니다

//정의
Set<Type> ()
var music: Set<String> = ["Hip-hop", "Pop", "Classic"]

insert(_:) 집합에 값을 추가하는 방식, 배열에서 append(_:)와 같다

music.insert("ballad")
//결과: ["Hip-hop", "Pop", "Classic", "ballad"]

배열과 동일하게 count가 존재합니다(같은 의미)
isEmpty속성의 값이 true(집합이 비어있을 때) 설정됩니다
한번 확인해봅시다

if music.isEmpty {
    print("텅~")
} else {
    print("\(music.count)개 있다")
}
//결과: 3개 있다

순회 탐색

배열과 마찬가지로 for ~ in구문을 이용하여 순회 탐색을 할 수 있습니다
배열처럼 인덱스를 활용하여 순회 탐색을 할 수는 없지만, 순회 속성이 제공되므로 집합 자체를 for ~ in구문에 그대로 넣고 순회 처리하는 방식

var music: Set = ["Hip-hop", "Pop", "Classic"]
for i in music {
    print(i)
}
//결과: Pop Classic Hip-hop

집합은 원래 순서가 없이 무작위로 나옵니다.
하지만 sort()메소드를 이용하여 정렬된 결과를 받을 수 있다

for i in music.sorted() {
    print(i)
}
//결과: Classic Hip-hop Pop

동적 추가와 삭제

위에 insert(_:)은 set에 추가, 이번에는 remove(_:)는 말 그래도 인자 값을 삭제하는 메소드입니다
removeAll()는 set안에 모든 값을 삭제하는 메소드 입니다

var music: Set = ["Hip-hop", "Pop", "Classic"]
music.insert("ballad")
//결과: ["Hip-hop", "balled", "Pop", "Classic"] -> 순서와 상관 없이 아무 곳이나 들어간다

music.remove("Pop")
결과: ["Hip-hop", "balled", "Classic"] -> 순서와 상관 없이 삭제가 됩니다

music.removeAll()
if music.isEmpty() {
    print("텅~"
} else {
    print("값이 존재합니다")
}
//결과: 텅~

집합 연산

기본 집합 연산

1)intersection(_:)
두 개의 집합에서 공통되는 값만 가져와서 새로운 집합을 만들어주는 메소드

var a = [1,2,3,4,5]
var b = [4,5,6,7,8]

a.intersection(b).sorted()
//결과: [4,5]

2) symmetricDifference(_:)
두 개의 집합에서 공통되지 않은 값만 가져와서 새로운 집합을 만들어주는 메소드

var a = [1,2,3,4,5]
var b = [4,5,6,7,8]

a.symmetricDifference(b).sorted()
//결과: [1,2,3,6,7,8]

3)union(_:)
두 개의 집합에서 모든 값을 가져와서 새로운 집합을 만들어주는 메소드

var a = [1,2,3,4,5]
var b = [6,7,8,9,10]

a.union(b).sorted()
//결과: [1,2,3,4,5,6,7,8,9,10]

4)subtract(_:)
기준이 되는 집합에서 공통으로 들어간 값만삭제하고 새로운 집합을 만들어주는 메소드
사실 이해가 잘 안갈수도 있으니, 예시를 들어 확인해보자

var a = [1,2,3,4,5]
var b = [0,1,3,6,7]

a.subtract(b).sorted()
//결과: [2,4,5]
//b에서는 1,3이 공통임으로 제거 후에 2,4,5만 따로 새로운 집합됩니다

부분집합과 포함관계 판단 연산

1)isSubset(of:)
주어진 집합의 값 전체가 특정 집합에 포함되는지를 판단하여 bool type으로 반환

var a = [1,2,3,4,5]
var b = [2,3,4]
b.isSubset(of:a)
//a안에 b가 포함되어 있나요?
//결과: true

2)isSuperset(of:)
주어진 집합이 특정 집합의 모든 값을 포함 하는지 판단하여 bool type으로 반환

var a = [1,2,3,4,5]
var b = [2,3,4]

a.isSuperset(b)
//a안에 b의 모든값이 포함되어 있나요?
//결과: true

3)isStrictSubset(of:)와 isStrictSuperset(of:)
위에 두 메소드처럼 주어진 집합이 특정 집합의 부분집합인지 상위집합인지를 판단 하는 역할

4)isDisjoint(with:)
두 집합 사이의 공통 값을 확인하여 공통 값이 없으면 true, 있다면 false 반환

var a = [1,2,3,4,5]
var b = [6,7,8]

a.isDisjoint(b)
//결과: true