해시 함수는 데이터를 고정된 길이의 값으로 변환하는 함수입니다. Swift에서는 Hashable
프로토콜을 구현하여 해시 가능한 타입을 정의할 수 있습니다. 이번 블로그 포스트에서는 Swift에서 해시 함수를 활용하는 방법에 대해 알아보겠습니다.
해시 가능한 타입 정의하기
해시 가능한 타입을 정의하기 위해서는 다음과 같은 단계를 따라야 합니다.
Hashable
프로토콜을 채택합니다.Hashable
프로토콜의 요구사항을 구현합니다.- 동등성 비교를 위해
Equatable
프로토콜을 채택합니다.
struct Person: Hashable {
let name: String
let age: Int
}
extension Person: Equatable {
static func == (lhs: Person, rhs: Person) -> Bool {
return lhs.name == rhs.name && lhs.age == rhs.age
}
}
위 코드에서 Person
구조체는 Hashable
프로토콜과 Equatable
프로토콜을 구현하고 있습니다.
Set과 Dictionary에서 활용하기
해시 함수를 정의한 타입은 Set
이나 Dictionary
의 키 타입으로 사용할 수 있습니다. 아래 예시를 살펴보겠습니다.
let john = Person(name: "John", age: 25)
let jane = Person(name: "Jane", age: 30)
let jim = Person(name: "Jim", age: 25)
var personsSet: Set<Person> = []
personsSet.insert(john)
personsSet.insert(jane)
personsSet.insert(jim)
print(personsSet) // [Person(name: "John", age: 25), Person(name: "Jane", age: 30)]
var personsDict: [Person: Int] = [:]
personsDict[john] = 123
personsDict[jane] = 456
personsDict[jim] = 789
print(personsDict) // [Person(name: "Jim", age: 25): 789, Person(name: "John", age: 25): 123, Person(name: "Jane", age: 30): 456]
위 예시에서 Person
타입을 Set
과 Dictionary
의 키 타입으로 사용하고 있습니다. Person
인스턴스들은 값이 동일하면 같은 키로 간주되어 중복이 제거되거나 마지막 값으로 덮어쓰여집니다.
해시 함수 재정의하기
Swift에서는 기본적으로 Hashable
프로토콜을 구현하여 해시 함수를 자동으로 생성합니다. 하지만 경우에 따라 해시 함수를 재정의해야 할 수도 있습니다. 해시 함수를 재정의하려면 다음과 같은 단계를 따르면 됩니다.
- 해시 값을 계산할 프로퍼티를 선택합니다.
hashValue
프로퍼티를 재정의하여 해시 값을 반환합니다.
struct Person: Hashable {
let name: String
let age: Int
func hash(into hasher: inout Hasher) {
hasher.combine(name)
hasher.combine(age)
}
}
위 코드에서는 hashValue
프로퍼티를 재정의하는 대신 hash(into:)
메서드를 구현하여 해시 값을 계산하고 있습니다. Hasher.combine()
메서드를 사용하여 계산에 필요한 프로퍼티를 결합합니다.
결론
Swift에서 해시 함수를 활용하기 위해 Hashable
프로토콜을 구현하고 해시 가능한 타입을 정의할 수 있습니다. 이를 통해 Set
, Dictionary
등의 자료구조에서 중복 제거나 키-값 쌍의 관리를 더 효율적으로 할 수 있습니다.
더 자세한 내용은 공식 문서를 참고하시기 바랍니다.