티스토리 뷰

반응형

 

 

 

안녕하세요~ Developer, 멍구입니다.  🤗

저번에는 Set의 집합 연산 메서드에 대해서 알아봤었는데요,
사실 Set 집합 자료구조에서도 다양한 Sequence 타입의 메서드를 사용할 수 있습니다. 오늘은 Set에서 그러한 Sequence, 컬렉션 메서드를 사용하는 예시를 정리해보겠습니다.

 

 

 


Set Operation Methods & Properties
Set 집합 연산 메서드 및 프로퍼티

 

 

var primes: Set = [2, 3, 5, 7]

// - isSubset 메서드는 A.isSubset(B) 라 할때, A가 B의 부분집합 인지 유무를 판단하여 Bool 타입을 리턴합니다.
// - 0 ~ 9 의 범위 내에 2, 3, 5, 7 값이 있으므로 true를 반환합니다.
print(primes.isSubset(of: 0..<10))

먼저, [2, 3, 5, 7]을 갖고 있는 Set<Int> 타입의 primes가 선언되었습니다. 아래에서는 isSubset 프로퍼티를 통해서 primes가 0..<10 사이의 subset(부분집합) 인지를 확인하고 있습니다.

이 경우에 primes는 0..<10 범위 내에 모든 값이 존재하는 부분집합(subset)이므로 true를 반환하지요. 

 

 

이 경우 외에도 Set 집합에서는 합집합, 차집합, 교집합, 대칭차 연산 등을 위해 사용되는 대표적인 Set 집합 메서드를 제공하고 있었습니다. 

var primes: Set = [2, 3, 5, 7]

// 일반 배열을 인자로 넣어 집합연산을 할 수도 있습니다. 이 경우의 결과 값도 Set 집합 타입으로 반환합니다.
let otherNumbers = [5, 7, 10, 11]
print(primes.union(otherNumbers))
print(primes.subtracting(otherNumbers))
print(primes.intersection(otherNumbers))
print(primes.symmetricDifference(otherNumbers))

위와 같이 union, subtracting, intersection, symmetricDifference 등의 메서드로 Set의 다양한 집합연산이 가능했습니다.

여기서 알면 좋은 점은, 해당 집합 연산 메서드의 인자값으로 Set타입이 아닌 일반 배열이 들어가도 문제 없다는 것입니다. 
물론 타입은 원본 Set 타입과 맞춰서 사용해야 겠죠?

집합 연산의 결과, Set을 반환하므로, 숫자 값의 순서는 비정렬 형태입니다. 



이제 본론으로가서, 일반 배열에서 사용하는 메서드를 Set 집합에서 활용하는 방법도 알아보겠습니다. 

 

 

 


Sequence and Collection Operations
Set의 Sequence, Collection 연산하기

 

Set 집합 자료구조에서도 기본 Set 집합 연산 메서드 뿐만 아니라, 다른 시퀀스 타입인 Array 배열 타입 등에서 사용하는 다양한 메서드, 프로퍼티를 사용할 수 있습니다.

var primes: Set = [2, 3, 5, 7]

// Sequence and Collection Operations
// Set에서는 일반적인 Set 타입의 연산 메서드 뿐만아니라, 변하기 않는 시퀀스 나 컬렉션으로서의 메서드 또한 사용할 수 있습니다.
// Set에서도 일반 Array에서 사용하는 프로퍼티 인 isEmpty 프로퍼티를 사용해서 집합이 비어있는지를 확인할 수 있습니다.
if primes.isEmpty {
    print("There are no primes!!")
} else {
    print("We have \(primes.count) primes.") // We have 4 primes.
}

primes는 [2, 3, 5, 7]의 값을 가진 Set 집합인데도, 배열에서 사용할 수 있는 isEmpty 프로퍼티를 통해 값이 비어있는지 확인이 가능합니다. 

이런게 가능한 이유는, Set / Array / Dicrionary 등의 자료구조가 서로 동일한 특정 프로포콜을 준수하고 있기 때문입니다. 이 부분은 관심 있으시다면 찾아보시길 바랍니다. 😊

 

return value of isEmpty property in Set type collection



이 외에도 다양한 고차함수인 reduce, sorted, filter, map 등의 연산 메서드를 Set 집합에서도 사용할 수 있습니다. 

 

 


Set에 reduce, map, filter 등 사용하기

var primes: Set = [2, 3, 5, 7]

// - 고차함수, reduce를 활용해서 갖고 있는 집합의 총 합을 구할 수도 있습니다.
let primesSum = primes.reduce(0, +)
print("primesSum : \(primesSum)")

// - Set 집합에서 정렬에 사용하는 sorted(), 맵핑에 사용하는 map() 등을 사용할 수도 있습니다.
let primesStrings = primes.sorted().map(String.init)
print("primesStrings : \(primesStrings)") // ["2", "3", "5", "7"]

 

primes Set 집합에서도 배열 등에서 사용 가능한 메서드, reduce / map / filter / sorted 등을 사용할 수 있습니다. 
위의 코드에서는 primes.reduce(0, +)를 통해 집합의 총 합을 반환 받아 primesSum에 저장하고 있습니다. 

return value of reduce, sroted, map operator method


primes에 sorted() 메서드를 사용한 뒤 이어서 map 연산자를 통해 primes가 갖고 있는 값들을 오름차순 정렬 후 String 타입으로 하나하나 맵핑하고 있습니다. 그 결과로 나오는 값은 ["2", "3", "5", "7"]입니다.

여기서 주목해야 할 부분은 반환값이 Set이 아닌 Array<String> 타입이라는 점입니다. 이처럼 배열에서도 사용가능한 메서드는 반환형이 Set이 아닌 배열이 될 수도 있습니다.

이런 상황에서 결과를 Set 타입으로 그대로 유지하고 싶다면 어떻게 해야할 까요?

 

 

var primes: Set = [2, 3, 5, 7]

// - filter를 통해서 특정 조건에 충족되는 값으로 이루어진 배열을 얻을 수도 있습니다.
// - 이렇듯, Set에서 지원하는 메서드 중, 다른 시퀀스 타입에서 지원하는 메서드의 경우, Set이 아닌 Array 값 등을 반환할 수 있습니다.
//.  - 이런 경우에도 Set 타입을 반환받고 싶다면, 결과를 Set타입으로서 다시 생성하면 됩니다.
let filteredPrimesArray = primes.filter { $0 <= 7 } // Array<Int> 타입
let filteredPrimesSet = Set(filteredPrimesArray) // Set<Int> 타입

여러분이 생각하시는 그대로(?) 겠지요? 바로 그 결과값을 그대로 Set타입으로 바꾸면 되는겁니다. 😀
위의 코드는 Set<Int> 타입의 primes을 7보다 작은 값만 남도록 filter 함수를 사용한 뒤 반환받은 Array<Int> 타입 결과를 Set<Int>로 변환시키는 과정입니다. 

filter를 사용한 직후에는 Array<Int>, 이후 Set으로 타입을 바꾸어 Set<Int>가 되는 것입니다. 위와 같이 배열에 Set을 래핑해주면 간단하게 Set 타입으로 변경시킬 수 있습니다!

 

 


for-in 루프로 Set 집합의 값 순회하기

// Set의 값들을 for-in 루프로 순회할 수도 있습니다.
for prime in primes {
    print(prime)
}

또한 Set 집합도 일반 배열처럼 for-in 루프로 값을 순회할 수 있습니다. 다만, 비정렬 방식의 자료구조인 Set은 그 값이 순서대로 나오지 않습니다. 그래도 모든 값을 순회하는 점을 통해서 상황에 따라 유용하게 활용할 수 있겠죠??

 

 


 

 

오늘은 이렇게 스위프트에서 사용되는 Set 집합의 다양한 Set, Sequence 메서드 활용방법을 알아봤습니다.
위와 같은 메서드를 숙지하고 Set을 잘 활용하면 Array와 함께 자유자재로 필요에 따라 변환해가며 사용될 수 있을 것 같습니다. 

다음에 좋은 주제로 포스팅 해보겠습니다. ^-^// 즐거운 코딩 되세요~ 👨🏻‍💻

 

 

반응형
댓글
반응형
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/10   »
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 31
글 보관함