콜렉션 타입 (Collection Types) - 집합 (Sets)

00yhsp·2024년 4월 4일

집합은 콜렉션의 순서와 상과없이 같은 타입의 다른 값을 저장한다.
아이템의 순서가 중요하지 않거나 아이템이 반복되면 안될 때 배열 대신에 집합을 사용할 수 있다.

Note:
Swift의 집합 타입은 Foundation의 NSSet 클래스와 연결된다.

집합 타입을 위한 해쉬 값 (Hash Values for Set Types)

집합(set)에 저장하기 위해 타입은 반드시 hashable이어야 한다.
즉, 해쉬 값 (hash value)을 계산할 수 있는 방법을 타입은 제공해야 한다.
해쉬 값은 동일하게 비교되는 모든 객체에 대해 동일한 Int 값으로 a == b이면 a.hashValue == b.hashValue를 따른다.

Swift의 모든 기본 타입(String, Int, Double, 그리고 Bool)은 기본적으로 hashable이고 집합의 값 타입 또는 딕셔너리의 키 타입으로 사용할 수 있다.
연관된 값이 없는 열거형 (Enumeration) 케이스 값은 기본적으로 hashable이다.

Note:
집합 값 타입 또는 딕셔너리 키 타입으로 사용자화 타입을 사용하려면 Swift 표준 라이브러리의 Hashable 프로토콜을 준수해야 사용할 수 있다.

집합 타입 구문 (Set Type Syntax)

Swift 집합의 타입은 Element가 집합의 저장할 값의 타입을 나타내는 Set 로 작성된다.
배열과 반대로 집합은 짧은 등가 형식이 없다.

빈 집합 생성과 초기화 (Creating Initializing an Empty Set)

초기화 구문을 사용하여 타입을 포함한 빈 집합을 생성할 수 있다.

var letters = Set<Character>()
print("letters is of type Set<Character> with \(letters.count) items.")
// Prints "letters is of type Set<Character> with 0 items."

또한 컨텍스트가 함수 인수 또는 이미 타입이 명시된 변수 또는 상수로 타입 정보를 이미 제공한다면 빈 배열 리터럴을 사용하여 빈 집합을 생성할 수 있다.

letters.insert("a")
// letters now contains 1 value of type Character
letters = []
// letters is now an empty set, but is still of type Set<Character>

배열 리터럴로 집합 생성 (Creating a Set with an Array Literal)

집합 콜렉션으로 하나 이상의 값으로 짧은 방법과 같이 배열 리터럴을 사용하여 집합을 초기화 할 수도 있다.
아래 예제는 String 값을 저장하는 favoriteGenres 라는 집합을 생성한다.

var favoriteGenres: Set<String> = ["Rock", "Classical", "Hip hop"]
// favoriteGenres has been initialized with three initial items

favoriteGenres 변수는 Set 라고 쓰고 "String 값의 집합" 으로 선언된다.
이 집합은 특정 String 타입의 값을 가지고 있기 때문에 String 값만 저장할 수 있다.
여기서 favoriteGenres 집합은 배열 리터럴 안에 적힌 3개의 String 값 ("Rock", "Classical", "Hip hop")으로 초기화된다.

집합 타입은 배열 리터럴에서 추론할 수 없기 때문에 Set 타입은 명시적으로 선언해야 한다.
그러나 Swift의 타입 추론 때문에 배열 리터럴로 초기화 할 때 하나의 타입의 값이 포함되어 있는 경우 집합 요소의 타입을 명시하지 않아도 된다. favoriteGenres 초기화는 짧게 쓸 수 있다.

var favoriteGenres: Set = ["Rock", "Classical", "Hip hop"]

배열 리터럴 안 값은 같은 타입이기 때문에 Swift는 favoriteGenres 변수를 사용함에 있어 Set 이라고 유추할 수 있다.

집합 접근과 수정 (Accessing and Modifying a Set)

메소드와 프로퍼티로 집합에 접근/수정할 수 있다.
읽기 전용 count 프로퍼티로 집합의 아이템 갯수를 알 수 있다.

print("I have \(favoriteGenres.count) favorite music genres.")
// Prints "I have 3 favorite music genres."

count 프로퍼티가 0과 같은지 부울 isEmpty 프로퍼티를 사용해 확인할 수 있다.

if favoriteGenres.isEmpty {
  print("As far as music goes, I'm not picky.")
} else {
  print("I have particular music preferences.")
}
// Prints "I have particular music preferences."

집합의 insert(_:) 메소드를 호출하여 집합에 새로운 아이템을 추가할 수 있다.

favoriteGenres.insert("Jazz")
// favoriteGenres now contains 4 items

집합의 remove(:) 메소드를 호출하여 집합의 아이템을 삭제할 수 있다.
remove(
:) 메소드는 집합에 아이템이 있을 경우 삭제하고 삭제된 값을 반환하거나 해당 아이템이 없을 경우 nil을 반환한다.
또한 removeAll() 메소드를 사용하여 전체 아이템을 삭제할 수 있다.

if let removedGenre = favoriteGenres.remove("Rock") {
  print("\(removedGenre)? I'm over it.")
} else {
  print("I never much cared for that.")
}
// Prints "Rock? I'm over it."

contain(_:) 메소드를 사용하여 집합에 특정 아이템이 포함되어 있는지 알 수 있다.

if favoriteGenres.contains("Funk") {
  print("I get up on the good foot.")
} else {
  print("It's too funky in here.")
}
// Prints "It's too funky in here."

집합 반복 (Iterating Over a Set)

for-in 루프와 함께 집합에 값을 반복할 수 있다.

for genre in favoriteGenres {
  print("\(genre)")
}
// Classical
// Jazz
// Hip hop

Swift의 Set 타입은 정의된 순서를 가지고 있지 않다.
특정 순서로 집합의 값을 반복하려면 집합의 요소를 < 연산자를 사용하여 정렬하여 반환하는 sorted() 메소드를 사용한다.

for genre in favoriteGenres.sorted() {
    print("\(genre)")
}
// Classical
// Hip hop
// Jazz
profile
iOS Dev

0개의 댓글