Skip to content

Latest commit

ย 

History

History
48 lines (29 loc) ยท 2.94 KB

Hashable,Equatable.md

File metadata and controls

48 lines (29 loc) ยท 2.94 KB

Hashable์ด ๋ฌด์—‡์ด๊ณ , Equatable์„ ์™œ ์ƒ์†ํ•ด์•ผ ํ•˜๋Š”์ง€ ์„ค๋ช…ํ•˜์‹œ์˜ค.

์ฐธ๊ณ 

Answer

์‚ฌ์ „ ์ง€์‹

hash๋ž€, ํ•ด์‹œ ํ•จ์ˆ˜์— ์˜ํ•ด ์–ป์–ด์ง€๋Š” ๊ฐ’์œผ๋กœ ํ•ด์‹œ๊ฐ’(hashValue), ํ•ด์‹œ์ฝ”๋“œ, ํ•ด์‹œ ์ฒดํฌ์„ฌ์œผ๋กœ๋„ ๋ถˆ๋ฆฝ๋‹ˆ๋‹ค.

hash function, ์ž„์˜์˜ ๊ธธ์ด์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ณ ์ •๋œ ๊ธธ์ด์˜ ๋ฐ์ดํ„ฐ๋กœ ๋งคํ•‘ํ•˜๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.

HashTable์—์„œ hash๊ฐ’์„ ์ฐพ๊ธฐ ์œ„ํ•ด์„  key๊ฐ€ ํ•„์š”ํ•˜๊ณ  ์ด key๋Š” unique ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Hashable

protocol Hashable

๊ณต์‹๋ฌธ์„œ์— ๋”ฐ๋ฅด๋ฉด, Hashable์ด๋ž€ ์ •์ˆ˜ํ˜•์˜ ํ•ด์‹œ๊ฐ’์„ ์ œ๊ณตํ•˜๋Š” "Hasher"๋กœ ํ•ด์‹ฑ๋  ์ˆ˜ ์žˆ๋Š” ํƒ€์ž…์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

  • ์šฐ๋ฆฌ๋Š” set์ด๋‚˜ dictionary์˜ key๊ฐ’์œผ๋กœ Hashable ํ”„๋กœํ† ์ฝœ์„ ์ค€์ˆ˜ํ•˜๋Š” ํƒ€์ž…์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋Œ€๋‹ค์ˆ˜์˜ standard library ๋‚ด์˜ ํƒ€์ž…๋“ค์€ Hashable์„ ์ค€์ˆ˜ํ•˜๊ณ  ์žˆ์ฃ .(String, Integers, Float, Boolean ๋“ฑ)
  • ๊ทธ ์™ธ ๋‹ค๋ฅธ ํƒ€์ž…๋“ค์—๋Š” Optional, Array, range ๋“ฑ์ด ์žˆ๋Š”๋ฐ ์ด๋“ค์˜ type argument๋“ค์ด ๋™์ผํ•˜๊ฒŒ ๊ตฌํ˜„๋  ๋•Œ ์ž๋™์œผ๋กœ Hashable์ด ๋ฉ๋‹ˆ๋‹ค. Bool?, [String] ๋“ฑ์ด ์žˆ์„ ์ˆ˜ ์žˆ๊ฒ ์ฃ ?
  • ๋˜ํ•œ, associated ๊ฐ’์ด ์—†๋Š” enum(์—ด๊ฑฐํ˜•)์„ ์ •์˜ํ•œ๋‹ค๋ฉด, enum์€ ์ž๋™์œผ๋กœ Hashable์„ ์ค€์ˆ˜ํ•˜๊ฒŒ๋ฉ๋‹ˆ๋‹ค.
  • ์ปค์Šคํ…€ ํƒ€์ž…์˜ ๊ฒฝ์šฐ์—๋„ Hashableํ•œ ํƒ€์ž…์ด ๋  ์ˆ˜ ์žˆ๋Š”๋ฐ, hash(into: )๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค๋ฉด Hashable ์ค€์ˆ˜๊ฐ€ ๊ฐ€๋Šฅํ•ด์ง‘๋‹ˆ๋‹ค.
  • (์ €์žฅ property๋“ค์ด ๋ชจ๋‘ Hashableํ•œ ๊ตฌ์กฐ์ฒด, ๋ชจ๋‘ Hashableํ•œ enum ํƒ€์ž…์„ ๊ฐ€์ง„ enum ์ด๋ผ๋ฉด ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ hash(into:) ๋ฉ”์„œ๋“œ๋ฅผ ์ž๋™์œผ๋กœ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.)

๊ฐ’์„ ํ•ด์‹ฑํ•œ๋‹ค๋Š” ๊ฒƒ์€ ํ•„์ˆ˜ ๊ตฌ์„ฑ ์š”์†Œ(essential component)๋ฅผ ํ•ด์‹œ ํ•จ์ˆ˜(Hasher ํƒ€์ž…์œผ๋กœ ํ‘œ์‹œ๋˜๋Š”)์— ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
ํ•„์ˆ˜ ๊ตฌ์„ฑ ์š”์†Œ๋Š” ํƒ€์ž…์˜ Equatable ๊ตฌํ˜„์— ๊ธฐ์—ฌํ•˜๋Š” ๊ตฌ์„ฑ ์š”์†Œ์ž…๋‹ˆ๋‹ค. ๋™์ผํ•œ ๋‘ ์ธ์Šคํ„ด์Šค๋Š” ๊ฐ™์€ ์ˆœ์„œ๋กœ hash(into:)์—์„œ ๊ฐ™์€ ๊ฐ’์„ Hasher์— ๊ณต๊ธ‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์„œ Equatable์— ๋Œ€ํ•œ ์–ธ๊ธ‰์ด ๋‚˜์˜ค๋„ค์š”. Hashable์€ Equatable ํ”„๋กœํ† ์ฝœ์„ ์ƒ์† ๋ฐ›๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

Equatable์„ ์™œ ์ƒ์†ํ•ด์•ผ ํ• ๊นŒ?

protocol Equatable {
    static func == (lhs: Self, rhs: Self) -> Bool
}

ํ•ด์‹ฑ์„ ํ•˜๊ฒŒ ๋˜๋ฉด ํ•ด์‹œ๊ฐ’์ด๋ผ๋Š” ์ผ์ •ํ•œ ์ž๋ฆฟ์ˆ˜์˜ ๊ณ ์œ ๊ฐ’์„ ๋งŒ๋“ค์–ด๋ƒ…๋‹ˆ๋‹ค. ์ด ๊ฐ’์ด ๊ณ ์œ ๊ฐ’์ด๋ผ๋Š” ๊ฒƒ์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด์„œ Hashable์€ ๊ฐ’์ด ๋™์ผํ•œ ์ง€ ๋น„๊ต ํ•  ์ˆ˜ ์žˆ๋Š” ํƒ€์ž…์ธ Equatable์„ ์ค€์ˆ˜ํ•ฉ๋‹ˆ๋‹ค. Equatable์„ ์ค€์ˆ˜ํ•˜๋Š” ํƒ€์ž…์€ == ํ˜น์€ != ์‚ฌ์šฉํ•˜์—ฌ ๋™๋“ฑ์„ฑ์„ ๋น„๊ตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Set, Dictionary์˜ key๊ฐ’ ๋˜ํ•œ ์ค‘๋ณต์„ ํ—ˆ์šฉํ•˜๋ฉด ์•ˆ๋˜๋Š” ํŠน์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๊ทธ ํƒ€์ž… ์•ˆ์—์„œ ์œ ์ผ์„ฑ์ด ๋ณด์žฅ๋˜๋Š” Hashable์„ ์ค€์ˆ˜ํ•˜๋Š” ํƒ€์ž…๋งŒ ๋ฐ›๋„๋ก ๋˜์–ด์žˆ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. Set, Dictionary์˜ key๊ฐ’์˜ ์œ ์ผ์„ฑ ๋ณด์žฅ ๋…ธํ•˜์šฐ(?)๋Š” Hasing๊ธฐ๋ฒ•์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๊ฒ ๋„ค์š”.