본문 바로가기

iOS/Swift

Swift) Set - 자주 사용하는 메서드

 

 

 

안녕하세요 :) 소들입니다!!!!!

이번 포스팅에선 Set(집합)을 사용할 때 알아두면 편한 메서드들을 좀 정리해보려고 해요!!!

원래 설명충이긴 한데, 이번 포스팅만큼은 단순 명료하게 가겠슴니다!!

(물론 설명할 게 있는 부분은 설명충임 :))

 

모든 포스팅은 편의 말투로 합니다~!!

 

.

.

.

자 먼저..!!!

Swift의 Set의특징에 대해서 간!!!딴!!!!히!!!! 먼저 알고 가겠움 :)

 

 

🔸정렬되지 않은 컬렉션이다

(따라서 Set을 print할 경우, 삽입 순서에 상관 없이 뒤죽박죽 나온다)

🔸배열과 달리 중복 요소를 허용하지 않는다

🔸해시를 통해 값을 저장하기 때문에 배열에 비해 검색 속도가 빠르고, 당연히

저장되는 자료형은 Hashable 프로토콜을 준수하고 있어야 한다

🔸Swift는 형식에 민감쓰 하기 때문에, 저장되는 자료형은 모두 동일한 자료형이어야 한다

 

 

끄...읕... 🌝

아 참고로, Set도 배열&딕셔너리와 같은 Collection Type이고, 때문에

구조체로 Stack에 저장됨! 다만, NSSet이란 클래스도 지원함(Objective-C)

 

 

 

 

1. Set 생성하기

 

 

<주의> Set은 타입추론으로 생성 불가 (선언이 배열과 동일하게 때문)
var set1 = [15321]           // Set이 아닌 배열로 추론됨
 
// 1. 타입 Annotation으로 생성하기
var set2: Set<Int> = []
 
// 2. 생성자로 생성하기
var set3 = Set<Int>()
 

 

 

주의할 점!! Set은 배열과 동일하게 []로 생성하기 때문에,

타입 추론으론 생성할 수 없음!!! (무조건 배열로 추론됨)

 

또한, 여러 타입의 값을 저장하고 싶을 경우 Any를 선언할 수 있는 배열이나 딕셔너리의 Value와 달리,

앞서 말했듯 Set은 Hashable 프로토콜을 채택한 자료형만 저장할 수 있기 때문에 

 

 

 

 

Any로는 생성 불가하지만!!

타입에 민감하지 않은 Objective-C의 NSSet이란 클래스를 이용하면

 

 

// 3. 여러 타입을 저장하는 Set 생성하
var set3: NSSet = [1"s"]

 

 

여러 타입을 지정하는 Set 사용 가능 :)

 

 

 

 

2. Set 갯수 확인하기

 

 

var set1: Set<Int> = [1250]
 
let count: Int = set1.count            // Set 갯수 확인 : 4
let isEmpty: Bool = set1.isEmpty       // Set 비었는지 확인 : false

 

 

만약 Set이 비었는지를 확인하고 싶다면

set1.count == 0 이 구문보단, set1.isEmpty를 사용합시다 :)

 

 

 

 

3. Set 요소 확인하기

 

 

var set1: Set<Int> = [1250]
 
set1.contains(1)                    // true
set1.contains(10)                   // false

 

 

배열과 동일하게 contains 메서드를 쓰면 됨!!

근데 배열과 다른 점은, 배열의 contains를 쓸 경우 순회 탐색을 하지만,

(0번 index부터 마지막 index까지 요소가 있나 순차적으로 탐색)

Set은 딕셔너리와 같이 해시로 구현되어 있어, 해ㅅ ㅣ충돌이 일어나지 않는 한

시간 복잡도가 상수로, O(1) 만큼만 걸림!!! (배열에 비해 매우 빠르단 것)

 

 

 

 

4. Set에 값 추가하기

 

 

var set1: Set<Int> = [1250]
 
// 1. insert : 값을 추가하고, 추가된 결과를 튜플로 리턴 (중복이면 false, 추가된 값)
set1.insert(1)                // (false, 1)
set1.insert(10)               // (true, 10)
 
// 2. update : 값이 존재하지 않으면 추가 후 nil 리턴, 존재할 경우 덮어쓰기 후 덮어쓰기 전 값 리턴
set1.update(with1)          // Optioanl(1)
set1.update(with120)        // nil

 

 

보통 insert와 update를 합쳐서 upsert 작업이라고 함 :)

위 두 함수는 모두 Set에 upsert 작업을 하지만, 결과 값의 차이가 있음!!!

 

 

 

 

5.  Set 요소 삭제하기

 

 

var set1: Set<Int> = [1250]
 
// 1. remove() : 한 가지 요소 삭제할 때 사용, 삭제 후 삭제한 값 return (없는 요소 삭제 시 nil 리턴)
set1.remove(1)              // Optional(1)
set1.remove(10)             // nil
 
// 2. removeAll() : 전체 요소 삭제
set1.removeAll()  
 

 

 

쉽군 :)

 

 

 

 

6. Set 비교하기

 

6-1. ==(!=) 연산자로 비교하기

 

 

var set1: Set<Int> = [1250]
var set2: Set<Int> = [0215]
var set3: Set<Int> = [131120]
 
set1 == set2            // true
set1 == set3           // false
 

 

 

set은 정렬되지 않은 Collection 이기 때문에,

순서에 상관 없이 모든 요소가 같으면 비교 연산자가 true가 됨!!

 

 

 

6-2. 포함관계 확인하기

 

 ① 부분 집합 : isSubSet(of:) 

 

 

var set1: Set<Int> = [1250]
var set2: Set<Int> = [12]
 
set1.isSubset(of: set2)               // false
set2.isSubset(of: set1)               // true

 

 

 ② 상위 집합 : isSuperSet(of:) 

 

 

var set1: Set<Int> = [1250]
var set2: Set<Int> = [12]
 
set1.isSuperset(of: set2)               // true
set2.isSuperset(of: set1)               // false

 

 

 ③ 같은 집합 / 서로수 집합 : isDisjoint(with:) 

 

 

var set13: Set<Int> = [1250]
var set14: Set<Int> = [1250]
var set15: Set<Int> = [37910]
 
set13.isDisjoint(with: set14)               // false (같은 집합 : 모든 요소가 동일한 집합)
set15.isDisjoint(with: set13)               // true  (서로수 집합 : 모든 요소가 다른 집합)

 

 

서로수 집합이면 true, 모든 요소가 동일하면 true

 

 

 

 

7. Set의 연산

 

 

 

 

음 이건 한번에 정리 하겠음 :)

 

 

var a: Set = [1,2,3,4,5,6,7,8,9]
var b: Set = [1,3,5,7,9]
var c: Set = [2,4,6,8,10]
 
// 1. intersection : 교집합을 새로운 Set으로 리턴
a.intersection(b)                     // [1, 3, 5, 9, 7]
b.intersection(c)                     // [] : 겹치는 요소 없음
 
// 2. union : 합집합을 새로운 Set으로 리턴
a.union(b)                            // [2, 7, 9, 4, 8, 5, 6, 1, 3]
b.union(c)                            // [9, 3, 10, 4, 1, 8, 7, 2, 6, 5]
 
// 3. sysmetricDifference : 여집합을 새로운 Set으로 리턴
a.symmetricDifference(b)              // [4, 8, 6, 2]
b.symmetricDifference(c)              // [10, 9, 8, 6, 7, 1, 2, 4, 3, 5]
 
// 4. subtracting : 차집합을 새로운 Set으로 리턴
a.subtracting(b)                      // [4, 8, 6, 2]
b.subtracting(c)                      // [9, 1, 3, 5, 7]

 

 

 

 

+ 만약 Set의 순회(for - in, forEach) 등에 대해 알고 싶으신 분은

이 포스팅을 참조해주센~~

 

 

 

 

.

.

.

Set을 사용할 때 어쩌면 필수고 어쩌면 알아두면 좋은

메서드들 정리 끝 :) 드디어 Collection Type 포스팅이 끝났다 ~.~

 

잘못된 내용, 피드백, 궁금증은 언제나 댓글 주세요 💩

그럼 20,000

 

 



Calendar
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
최근 댓글
Visits
Today
Yesterday