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

Yellowtoast·2023년 2월 15일
0

Swift

목록 보기
5/11
post-thumbnail

해당 글은 [ 꼼꼼한 재은씨의 Swift : 문법편 ] 을 읽고 배운 내용을 정리한 글입니다.

집단 자료형

스위프트에서 제공하는 집단 자료형은 크게 4가지입니다.

  • 배열(Array)
  • 집합(Set)
  • 튜플(Tuple)
  • 딕셔너리(Dictionary)

집합(Set)

집합은 내부적으로 해시(Hash)연산의 결과값을 이용하여 데이터를 저장하므로 집합에 저장할 데이터 타입은 해시 연산을 할 수 있는 타입이어야 합니다. 다시 말해 집합에 저장할 데이터 타입은 반드시 해시값을 계산하는 방법을 제공해야 한다는 뜻입니다.

만약 스위프트에서 기본으로 제공하는 타입이 아닌 우리가 임의로 만든 타입을 사용하여 집합의 아템으로 저장하려면, 스위프트 표준 라이브러리에서 제공하는 Hashable 프로토콜을 구현해야 합니다.

집합의 정의

var genres : Set = ["Classsic", "Rock", "Balad"]

var genres2 = Set<String>()

genres.insert("Horror")

집합의 순회 탐색

for~in 구문을 이용하여 집합도 배열처럼 순회 탐색을 할 수 있습니다.

집합 연산

  • intersection(_:)
    양쪽 집합에서 공통되는 아이템만 선택하여 새로운 집합을 만들어주는 메소드입니다.
    수학에서 이에 해당하는 연산은 교집합입니다.
  • symmetricDifference(_:)
    양쪽 집합 중에서 어느 한쪽에만 있는 아이템을 선택하여 새로운 집합을 만 들어주는 메소드입니다. 양쪽 집합 모두에 공통으로 있는 아이템은 제외됩니다.
  • union(:)
    양쪽 집합에 있는 모든 아이템을 선택하여 새로운 집합을 만들어주는 메소드입니다. 양쪽 집 합 중 어느 한쪽에만 있거나 양쪽 집합 모두에 공통으로 있는 아이템을 모두 선택하지만, 공통으로 있는 아 이템이라고 하여 중복해서 추가되지는 않습니다. 수학에서 이에 해당하는 연산은 합집합입니다.
  • subtract(:)
    한쪽 집합에 있는 모든 아이템에서 다른 쪽 집합에도 속하는 공통 아이템을 제외하고 새로 운 집합을 만들어주는 메소드입니다. 주로 한쪽 집합에서 다른 쪽 집합을 빼는 연산으로 처리되며 수학에서 이에 해당하는 연산은 차집합입니다.
var oddbigits : Set = [ 1, 3 , 5 , 7 , 9 ]// 홀수 집합
let evenDigits : Set = [ 0, 2, 4, 6 , 8 ] // 짝수 집합
let primeDigits : Set = [ 2, 3 , 5 , 7 ] // 소수 집합

oddDigits.intersection(evenDigits).sorted ()
// [ ]

oddDigits.symmetricDifference(primeDigits).sorted()
// [1, 2, 9]

oddDigits.union(evenDigits).sorted ()
// [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

oddDigits.subtract(primeDigits)

oddDigits.sorted ()
// [1, 9]

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

  • isSubset(of:)
    주어진 집합의 값 전체가 특정 집합에 포함되는지를 판단하여 true, faso를 반환합니다. 수학적으로 이야기하자면 하나의 집합이 다른 집합의 부분집합인지 여부를 판단합니다.
  • isSuperset(of:)
    주어진 집합이 특정 집합의 모든 값을 포함하는지를 판단하여 true, false를 반환합니다. isSubset(:)와는 반대 상황을 판단하는 것으로, 집합이 다른 집합의 상위집합 역할을 하는가에 대한 판단을 담당하는 메소드라고 할 수 있습니다.
  • isStrictSubset(of:)와 isStrictSuperset(of:)
    조금 전 설명한 두 메소드처럼 주어진 집합이 특정 집합의 부 분집합인지 아니면 상위집합인지를 판단하는 역할을 하지만 두 집합이 서로 같은 경우의 결과값이 다르게 반 환됩니다. 두 집합이 서로 일치할 경우 수학적으로는 서로가 서로의 부분집합이자 상위집합이 될 수 있으므로 isSubset(of:), isSuperset(of:) 메소드가 true를 반환하는 반면, isStrictSubset(of:)와 isStrictSuperset(of:) 메소드는 이를 더 엄격하게 판단하여 정확히 부분집합. 또는 상위집합일 때만 true를 반환합니다. 서로 일치 하는 집합은 동일한 집합으로 판단하지 부분집합이나 상위집합으로 판단하지 않는다는 뜻입니다.
  • isDisjoint(with :)
    두 집합 사이의 공통 값을 확인하여 아무런 공통 값이 없을 때 true를, 공통 값이 하나라 도 있으면 false를 반환합니다.
let A : Set = [1, 3, 5, 7, 91
let B : Set = [3, 5]
let C : Set = [3, 5]
let D: Set = [2, 4, 6]

B.isSubset(of: A) // true
A.isSuperset (of: B) // true
C.isStrictSubset (of: A) // true
C.isStrictSubset(of: B) // false
A.isDisjoint(with: D) // true

집합의 이같은 특성을 사용하면 다른 문제도 쉽게 해결 가능합니다.
한 사람이 한번씩만 참여가능한 응모 프로그램의 경우, 응모 데이터를 집합으로 관리하기만 하면 데이터 타입 자체에서 중복값을 허용하지 않으므로 우리는 사용자의 중복 응모 여부를 고민할 필요 없이 편하게 관리할 수 있습니다.

profile
Flutter App Developer

0개의 댓글