본문 바로가기
공부/스위프트

[스위프트] 집합(Set) 사용법 & 예시

by 초코팅촉 2023. 7. 7.
728x90

집단 자료형(Collective Types)

서로 관련이 있는 자료들을 모아서 관리하기 편하게 만든 것이 집단 자료형이다.

이때 서로 관련이 있다는 말은 자료형이 같거나 한 가지 주제에 속해있는(예를 들면 신체 정보 - 키, 몸무게, 나이 등) 자료들을 말한다.

집합 자료형의 종류는 다음과 같다.

• 배열(Arrays)

• 집합(Set)

• 딕셔너리(Dictionary, 사전)

이 중 집합(Set)을 알아보자.

집합(Set)

순서(인덱스)와 중복이 없는, 같은 타입만 저장할 수 있는 집단 자료형이다.

순서가 없기 때문에 1, 2, 3, 4, 5의 순서로 생성해도 순서가 뒤바뀔 수 있다.

또한 중복이 없어서 1, 1, 1, 1, 2 로 생성하면 1, 2 로 저장된다.

스위프트에서 집합의 특징은 다음과 같다.

• 중복이 불가능하다.

• 순서(인덱스, Index)가 없다.

• 집합에 사용될 자료형은 반드시 해시(Hash) 연산이 가능한 타입이어야 한다.

세번째 특징이 낮설게 느껴질 수 있지만 설명하자면,

집합은 내부적으로 해시(Hash) 연산의 결과값을 이용해 데이터를 저장한다.

따라서 집합에 저장할 데이터 타입은 반드시 해시 연산을 할 수 있어야 한다.

하지만 타입에 대해 따로 생각하지 않아도 되는데, 스위프트에서 제공해주는 모든 기본 타입은 해시 연산이 가능하기 때문이다.

 

선언 및 초기화

var set1 = Set<Int>()
var set1: Set<Int> = [1, 2]
var set1: Set = [1, 2]    //타입 추론덕에 데이터의 자료형 생략 가능

 

데이터 추가

집합은 앞서 말했듯 순서 개념(인덱스; Index)이 없기 때문에

데이터를 추가하는 방법은 insert(_:)함수 하나밖에 없다.

또한 집합 특성상 중복도 안돼서 중복되는 데이터를 넣어도 무시된다.

사용법은 단순히 괄호안에 넣고 싶은 값을 넣으면 된다.

var set1.insert(5)    // 1,2,5
var set1.insert(1)    // 1,2,5 이 순서는 편의상 오름차순으로 쓴것으로 실제 순서는 다를수도 있다.

 

데이터 삭제

데이터 추가와 마찬가지로 인덱스가 없기 때문에 remove(_:)함수 하나밖에 없다.
괄호안에 넣은 값을 찾아 삭제할 값이 있다면 삭제하고 해당 값을 옵셔널로 반환한다. 값을 쓰고 싶으면 옵셔널을 벗겨야 한다.

없으면 nil을 반환한다.

arr1.remove(4)	// Optional(4)
print(arr1)	// 1, 2, 5

 

집합 연산

스위프트에는 수학에서의 집합 연산을 지원한다.

• union(_:) : 합집합

• intersection(_:) : 교집합

• subtracting(_:) : 차집합

• symmetricDifference(_:) : 대칭차집합

아래의 그림을 보면 이해가 쉽다.

집합 연산 종류

let numbersOne: Set = [1, 2, 4, 5, 8]
let numbersTwo: Set = [1, 3, 5, 7, 9]

numbersOne.union(numbersTwo)	// [1, 2, 3, 4, 5, 7, 8, 9]
numbersOne.intersection(numbersTwo)	// [1, 5]
numbersOne.subtracting(numbersTwo)	// [2, 4, 8]	
numbersTwo.subtracting(numbersOne)	// [3, 7, 9]
numbersOne.symmetricDifference(numbersTwo)	// [2, 3, 4, 7, 8, 9]

 

 

스위프트 문법 - 집합(Set), swift