안녕하세요, iOS 개발하는 루피입니다!
오늘은 Collection Type 중 Set에 대해 정리해보려고 합니다. 바로 시작합니다.
Set이란?
Set은 정의된 순서 없이 값은 유형의 고유한 값을 컬렉션에 저장합니다.
항목의 순서가 중요하지 않거나 항목이 한 번만 나타나도록 해야 하는 경우 Array 대신 Set을 사용한다면, 좀 더 쉽게 작업을 진행할 수 있겠죠?
Array 대신 Set을 사용하는 경우
1. 요소의 포함 여부를 효율적으로 확인해야 할 때
let set : Set<String> = [ "AB", "AC", "AD"]
if set.contains("AD") { print("True") }
이렇게 contains()를 사용한다면, 효율적으로 한 번에 포함 여부를 확인할 수 있습니다.
2. 컬렉션 내 요소의 순서가 중요하지 않을 때
let set : Set<String> = [ "AB", "AC", "AD"]
for i in set { print(i) }
set 안에 요소가 있는 경우 순서가 보장되지 않습니다.

하지만, Set은 중복을 자체적으로 관리한다는 특성이나, 여러 메서드를 가지고 있다는 점에서 순서가 중요한 작업이 아닌 경우 이점을 충분히 활용할 수 있습니다. 하지만, sort() 메서드를 이용하면 요소를 정렬할수 있습니다.(개발자가 따로 코드를 작성해야 합니다.)
for i in set.sorted() {
print("\(i)")
}
// 요소가 순서대로 정렬됩니다.
3. 각 요소가 컬렉션에 단 한 번만 나타나도록 보장해야 할 때.
let set : Set<String> = [ "AB", "AC", "AD", "AB"]
for i in set { print(i) }

중복된 요소가 존재하는 경우에도, 요소를 출력해 보면, 중복 없이 3개의 요소만 출력되는 것을 확인할 수 있습니다. 이처럼 Set은 중복 없이 단 한 번만 나타나도록 보장할 때 사용하게 되면, 유용할 수 있습니다.
Set을 사용할 때, 주의해야 하는 부분
1. Hashable 프로토콜을 준수하는 모든 타입의 요소로 생성할 수 있습니다.
Set은 내부적으로 해시 테이블을 사용하여 요소를 저장하고 검색하기 때문에, Hashable을 준수하는 타입만 요소로 사용할 수 있습니다.
따라서, class 나 struct의 경우 Hashable을 꼭 채택해 줘야합니다.
struct GridPoint: Hashable {
var x: Int
var y: Int
// 모든 저장 프로퍼티가 Hashable을 준수하므로
// 컴파일러가 자동으로 hash(into:) 메서드를 구현해줍니다.
}
// Set에 커스텀 타입 사용
let point1 = GridPoint(x: 10, y: 20)
let point2 = GridPoint(x: 30, y: 40)
let pointSet: Set = [point1, point2]
2. 반환 타입 주의
Set의 많은 메서드 특히, map(), filter() 등은 결과를 Array로 반환합니다. 따라서 개발자들은 Set의 고유한 특성(중복 제거, 순서 없음)이 필요한 경우 추가 작업이 필요합니다.
let primesStrings = primes.map(String.init)
// 'primesStrings'는 Array<String> 타입
let primesStringsSet = Set(primes.map(String.init))
// 'primesStringsSet'는 Set<String> 타입
3. Set 연산은 다른 Set뿐만 아니라 배열이나 다른 시퀀스 타입과도 사용할 수 있습니다.
var primes: Set = [2, 3, 5, 7]
// primes가 Range<Int>의 부분집합인지 확인
print(primes.isSubset(of: 0..<10))
// "true" 출력
// Array<Int>와 교집합 수행
let favoriteNumbers = [5, 7, 15, 21]
print(primes.intersection(favoriteNumbers))
// "[5, 7]" 출력
4. 시간 복잡도 & 공간 복잡도
Set의 공간 복잡도는 일반적으로 O(n)이며, 이때 n은 저장된 요소의 수입니다. 시간 복잡도의 경우 Set은 Array보다 많은 강점을 가지고 있습니다. 대부분의 경우 O(1)입니다. 심지어 삭제 같은 경우 Array removeFirst의 경우 O(N)인 반면 Set의 removeFirst()는 O(1)이기에 좋은 성능을 보입니다.
오늘도 화이팅입니다!
'iOS > Swift' 카테고리의 다른 글
| [Swift] 함수형 프로그래밍(Functional Programming) 1/2 (1) | 2025.01.13 |
|---|---|
| [Swift] 클로저(Closure) 2/2 (0) | 2025.01.13 |
| [Swift] 클로저(Closure) 1/2 (5) | 2025.01.13 |
| [Swift] 접근 제어자 (Access Control) (0) | 2025.01.12 |
| [Swift] Array (0) | 2025.01.05 |