ํ‹ฐ์Šคํ† ๋ฆฌ ๋ทฐ

0. ์„œ๋ก 

Swift์—์„œ Hashable ํ”„๋กœํ† ์ฝœ์€ Equatable์„ ์ƒ์†ํ•œ๋‹ค.

์ฆ‰ Hashable์„ ์ฑ„ํƒํ•˜๋ ค๋ฉด == ๋น„๊ต๊ฐ€ ๊ฐ€๋Šฅํ•œ ํƒ€์ž…์ด์–ด์•ผ ํ•œ๋‹ค๋Š” ๋œป์ด๋‹ค.

์ด๋ฅผ ์ฒ˜์Œ ๋ดค์„ ๋•Œ “ํ•ด์‹œ๋งŒ ์žˆ์œผ๋ฉด ๋˜์ง€ ์™œ equality๊นŒ์ง€ ์–ธ์–ด ์ฐจ์›์—์„œ ๊ฐ•์ œํ• ๊นŒ”๋ผ๋Š” ์˜๋ฌธ์„ ๊ฐ–๊ฒŒ ๋˜์—ˆ๋‹ค.

 

์ด ์˜๋ฌธ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด Dictionary/Set์˜ ๋™์ž‘ ๋ฐฉ์‹๊ณผ ํ•ด์‹œ ์ถฉ๋Œ(collision)์— ๋Œ€ํ•ด ํ•™์Šตํ•˜๊ณ  ๋‚ด์šฉ์„ ์ •๋ฆฌํ•ด๋ณธ๋‹ค.


1. Dictionary์˜ Key์™€ Set์˜ Element๋Š” Hashable์ด์–ด์•ผ ํ•œ๋‹ค

Swift ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ๋‹ค์Œ์€ ์ด๋ฏธ ๊ฒฐ์ •๋˜์–ด ์žˆ๋‹ค.

  • Dictionary<Key, Value>์—์„œ Key๋Š” Hashable์ด์–ด์•ผ ํ•œ๋‹ค.
  • Set<Element>์—์„œ Element๋Š” Hashable์ด์–ด์•ผ ํ•œ๋‹ค.

์ฆ‰, ํ•ด์‹œ ๊ธฐ๋ฐ˜ ์ปฌ๋ ‰์…˜์˜ ๊ตฌ์„ฑ์›์ด ๋˜๋ ค๋ฉด Hashable์€ ํ•„์ˆ˜ ์กฐ๊ฑด์ด๋‹ค.

์—ฌ๊ธฐ์„œ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์งˆ๋ฌธ์ด ์ƒ๊ธด๋‹ค.

“ํ•ด์‹œ๋งŒ ์žˆ์œผ๋ฉด ๋˜์ง€ ์™œ Equatable๊นŒ์ง€ ๊ฐ•์ œํ•˜๋Š”๊ฐ€”


2. ํ•ด์‹œ๋Š” ‘์œ ์ผํ•œ ํ‚ค’๊ฐ€ ์•„๋‹ˆ๋‹ค

ํ•ด์‹œ๋Š” ์ž…๋ ฅ(ํ‚ค)์„ ์ž‘์€ ๊ฐ’(ํ•ด์‹œ)์œผ๋กœ ์••์ถ•ํ•œ ๊ฒฐ๊ณผ๋‹ค.

์ž…๋ ฅ ๊ณต๊ฐ„์ด ์ถฉ๋ถ„ํžˆ ํฌ๋ฉด, ์„œ๋กœ ๋‹ค๋ฅธ ํ‚ค๊ฐ€ ๊ฐ™์€ ํ•ด์‹œ ๊ฐ’์„ ๊ฐ–๋Š” ์ƒํ™ฉ์ด ์›๋ฆฌ์ ์œผ๋กœ ๋ฐœ์ƒํ•œ๋‹ค.

์ด๋ฅผ ํ•ด์‹œ ์ถฉ๋Œ(collision) ์ด๋ผ๊ณ  ํ•œ๋‹ค.

 

ํ•ด์‹œ ์ถฉ๋Œ์ด ์กด์žฌํ•œ๋‹ค๋ฉด, ๋‹ค์Œ ๋ฌธ์€์ด ์„ฑ๋ฆฝ๋˜์ง€ ์•Š๋Š”๋‹ค.

  • hash(a) == hash(b)๋ผ๋ฉด a == b๋‹ค. (์„ฑ๋ฆฝ ๋ถˆ๊ฐ€)

์ฆ‰, ํ•ด์‹œ๋Š” “๋Œ€์ถฉ ์–ด๋””์— ์žˆ์„์ง€”๋ฅผ ์•Œ๋ ค์ฃผ๋Š” ํžŒํŠธ์ผ ๋ฟ, “์ด๊ฒŒ ์ง„์งœ ๊ฐ™์€ ํ‚ค๋‹ค”๋ฅผ ํ™•์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ’์ด ์•„๋‹ˆ๋‹ค.


3. Dictionary/Set์€ ํ•ด์‹œ๋งŒ์œผ๋กœ ๋™์ž‘ํ•˜์ง€ ์•Š๋Š”๋‹ค

Dictionary[key] ์กฐํšŒ๋‚˜ set.contains(x)๋Š” ํ•ด์‹œ๋กœ ๋๋‚˜์ง€ ์•Š๋Š”๋‹ค. ์ผ๋ฐ˜์ ์ธ ํ๋ฆ„์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  • ํ•ด์‹œ๋กœ ํ›„๋ณด ์œ„์น˜(๋ฒ„ํ‚ท/์Šฌ๋กฏ)๋ฅผ ์ฐพ๋Š”๋‹ค.
  • ํ›„๋ณด ์œ„์น˜์˜ ์—”ํŠธ๋ฆฌ๊ฐ€ “๋‚ด๊ฐ€ ์ฐพ๋Š” ํ‚ค”์ธ์ง€ ==๋กœ ํ™•์ธํ•œ๋‹ค.
  • ๊ฐ™์œผ๋ฉด ์กฐํšŒ/์—…๋ฐ์ดํŠธ๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค.
  • ๋‹ค๋ฅด๋ฉด ์ถฉ๋Œ ์ฒ˜๋ฆฌ๋กœ ๋‹ค์Œ ํ›„๋ณด๋ฅผ ํƒ์ƒ‰ํ•œ๋‹ค.

์ด ๊ตฌ์กฐ ๋•Œ๋ฌธ์— Hashable์€ ๊ฒฐ๊ตญ Equatable์ด ํ•„์š”ํ•˜๋‹ค.

์ถฉ๋Œ์ด ๊ฐ€๋Šฅํ•œ๋ฐ equality๊ฐ€ ์—†๋‹ค๋ฉด “๊ฐ™์€ ํ‚ค์ธ์ง€, ๋‹ค๋ฅธ ํ‚ค์ธ์ง€”๋ฅผ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.


(+) 4. Swift Dictionary: open addressing + linear probing

Swift ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ตฌํ˜„ ๋…ธํŠธ์— ๋”ฐ๋ฅด๋ฉด Dictionary์˜ native storage๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  • native storage๋Š” open addressing ํ•ด์‹œ ํ…Œ์ด๋ธ”์ด๋‹ค.
  • ์ถฉ๋Œ ํ•ด๊ฒฐ ๋ฐฉ์‹์€ linear probing์ด๋‹ค.

์ด๋ฅผ ๊ธ€์˜ ๋งฅ๋ฝ์œผ๋กœ ๋ฒˆ์—ญํ•˜๋ฉด ๋‹ค์Œ ์˜๋ฏธ๊ฐ€ ๋œ๋‹ค.

 

open addressing์€ ํ‚ค/๊ฐ’์„ ๋ณ„๋„ ์ฒด์ธ(์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ)์— ๋ถ™์ด์ง€ ์•Š๊ณ , ํ•ด์‹œ ํ…Œ์ด๋ธ”์˜ ์Šฌ๋กฏ(๋ฐฐ์—ด) ์ž์ฒด์— ์ง์ ‘ ์ €์žฅํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.

๊ทธ๋ฆฌ๊ณ  linear probing์€ ์ถฉ๋Œ์ด ๋‚˜๋ฉด ๋‹ค์Œ ์Šฌ๋กฏ, ๊ทธ ๋‹ค์Œ ์Šฌ๋กฏ… ์ฒ˜๋Ÿผ ์ˆœ์ฐจ์ ์œผ๋กœ ๋นˆ ์ž๋ฆฌ๋ฅผ ์ฐพ๊ฑฐ๋‚˜ ๋™์ผ ํ‚ค๋ฅผ ์ฐพ๋Š” ๋ฐฉ์‹์ด๋‹ค.

 

์ด ๋ฐฉ์‹์—์„œ๋Š” ์ถฉ๋Œ์ด ๋ฐœ์ƒํ–ˆ์„ ๋•Œ, ํ›„๋ณด ์Šฌ๋กฏ์„ ๋”ฐ๋ผ๊ฐ€๋ฉฐ ์—”ํŠธ๋ฆฌ๋ฅผ ๋งŒ๋‚  ์ˆ˜ ์žˆ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ ํ•ด์‹œ๊ฐ€ ๊ฐ™๋‹ค๊ณ  ํ•ด์„œ ๊ฐ™์€ ํ‚ค๋ผ๊ณ  ํ™•์ •ํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ, ํƒ์ƒ‰ ๊ณผ์ •์—์„œ ๋งค๋ฒˆ ์ด๋Ÿฐ ์งˆ๋ฌธ์ด ํ•„์š”ํ•˜๋‹ค.

  • “์ด ์Šฌ๋กฏ์˜ key๊ฐ€ ๋‚ด๊ฐ€ ์ฐพ๋Š” key์™€ ๊ฐ™์€๊ฐ€?”

์ด ์งˆ๋ฌธ์ด ๋ฐ”๋กœ == ๋น„๊ต๋‹ค. ๋”ฐ๋ผ์„œ Dictionary์˜ ๊ตฌ์กฐ๋Š” ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ Equatable์„ ์š”๊ตฌํ•˜๊ฒŒ ๋œ๋‹ค.


5. (if) ๋งŒ์•ฝ Equatable์ด ์—†๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ๋˜๋Š”๊ฐ€ 

Equatable์ด ์—†๋Š” ํ•ด์‹œ ๊ธฐ๋ฐ˜ ์ปฌ๋ ‰์…˜์€ ์ •ํ™•์„ฑ์„ ๋ณด์žฅํ•˜๊ธฐ ์–ด๋ ต๋‹ค.

์ถฉ๋Œ์ด ๊ฐ€๋Šฅํ•œ ์ˆœ๊ฐ„๋ถ€ํ„ฐ ๋™์ผ ํ‚ค ํŒ์ •์ด ๋ถˆ๊ฐ€๋Šฅํ•ด์ง€๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

  • ํ•ด์‹œ๋งŒ์œผ๋กœ๋Š” ๋™์ผ ํ‚ค๋ฅผ ํ™•์ •ํ•  ์ˆ˜ ์—†๋‹ค(์ถฉ๋Œ ๊ฐ€๋Šฅ).
  • equality(==)๊ฐ€ ์—†์œผ๋ฉด ์ถฉ๋Œํ•œ ๋‹ค๋ฅธ ํ‚ค์™€ ๋™์ผ ํ‚ค๋ฅผ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์—†๋‹ค.

๋”ฐ๋ผ์„œ ๋‹ค์Œ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธด๋‹ค.

5-1. ์—…๋ฐ์ดํŠธ์™€ ์‚ฝ์ž…์„ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์—†๋‹ค

  • “ํ•ด์‹œ๊ฐ€ ๊ฐ™์œผ๋ฉด ์—…๋ฐ์ดํŠธํ•œ๋‹ค” → ์„œ๋กœ ๋‹ค๋ฅธ ํ‚ค๊ฐ€ ๋ฎ์–ด์จ์ ธ ๋ฐ์ดํ„ฐ ์†์‹ค์ด ๋ฐœ์ƒํ•œ๋‹ค.
  • “ํ•ด์‹œ๊ฐ€ ๊ฐ™์•„๋„ ๋ฌด์กฐ๊ฑด ์ƒˆ๋กœ ๋„ฃ๋Š”๋‹ค” → ๋™์ผ ํ‚ค๊ฐ€ ์ค‘๋ณต ์ €์žฅ๋˜์–ด ์กฐํšŒ/์ˆ˜์ •์˜ ์ผ๊ด€์„ฑ์ด ๊นจ์ง„๋‹ค.

5-2. ์กฐํšŒ(get)์˜ ์ •ํ™•์„ฑ์„ ๋ณด์žฅํ•˜๊ธฐ ์–ด๋ ต๋‹ค

dict[key]๋Š” ํ›„๋ณด ์œ„์น˜๋ฅผ ์ฐพ์€ ๋’ค “์ •๋ง ๊ทธ key์ธ๊ฐ€”๋ฅผ ํ™•์ธํ•ด์•ผ ํ•œ๋‹ค.

==๊ฐ€ ์—†์œผ๋ฉด ์ด ํ™•์ธ์ด ๋ถˆ๊ฐ€๋Šฅํ•ด์ ธ ์ž˜๋ชป๋œ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ๋‹ค.

5-3. ๊ฒฐ๊ตญ equality๋Š” ๋ฐ˜๋“œ์‹œ ํ•„์š”ํ•˜๋‹ค

ํ”„๋กœํ† ์ฝœ ์ด๋ฆ„์ด Equatable์ด ์•„๋‹ˆ๋”๋ผ๋„, ์ •ํ™•์„ฑ์„ ์œ„ํ•ด์„œ๋Š” ์–ด๋–ค ํ˜•ํƒœ๋กœ๋“  “๋™์ผ์„ฑ ํŒ์ •”์ด ํ•„์š”ํ•˜๋‹ค.

Swift๋Š” ์ด๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ๊ฐ•์ œํ•˜๊ธฐ ์œ„ํ•ด Hashable : Equatable์„ ํƒํ•œ ๊ฒƒ์ด๋‹ค.


6. Hashable : Equatable์˜ ์˜๋ฏธ

ํ•ด์‹œ๋Š” ์ถฉ๋Œ์ด ๊ฐ€๋Šฅํ•˜๋ฏ€๋กœ, Dictionary/Set์€ ํ•ด์‹œ๋กœ ํ›„๋ณด๋ฅผ ์ขํžŒ ๋’ค ์ตœ์ข…์ ์œผ๋กœ ==๋กœ ๋™์ผ ํ‚ค/์š”์†Œ์ธ์ง€ ํ™•์ •ํ•ด์•ผ ์ •ํ™•์„ฑ์„ ๋ณด์žฅํ•  ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ Swift๋Š” ์ด๋ฅผ ํƒ€์ž… ์‹œ์Šคํ…œ์—์„œ ๊ฐ•์ œํ•˜๊ธฐ ์œ„ํ•ด Hashable์ด Equatable์„ ์ƒ์†ํ•˜๋„๋ก ์„ค๊ณ„ํ–ˆ๋‹ค.


7. ๋ฐ˜๋“œ์‹œ ์ง€์ผœ์•ผ ํ•˜๋Š” ๊ณ„์•ฝ(Contract)

ํ‚ค ํƒ€์ž…์ด Hashable์„ ์ค€์ˆ˜ํ•˜๋ ค๋ฉด ==์™€ hash(into:)๊ฐ€ ๋ฐ˜๋“œ์‹œ ์ผ๊ด€๋˜์–ด์•ผ ํ•œ๋‹ค.

  • a == b์ด๋ฉด ๋ฐ˜๋“œ์‹œ hash(a) == hash(b)์—ฌ์•ผ ํ•œ๋‹ค.
  • hash(a) == hash(b)์—ฌ๋„ a == b์ผ ํ•„์š”๋Š” ์—†๋‹ค(์ถฉ๋Œ ๊ฐ€๋Šฅ).

8. ์ถฉ๋Œ์€ ๊ดœ์ฐฎ๋‹ค. ๋ถˆ์ผ์น˜๋Š” ์œ„ํ—˜ํ•˜๋‹ค

์—ฌ๊ธฐ์„œ ์ •ํ™•์„ฑ๊ณผ ์„ฑ๋Šฅ์„ ๊ตฌ๋ถ„ํ•˜๋ฉด ์ดํ•ด๊ฐ€ ๋” ๊น”๋”ํ•ด์ง„๋‹ค.

  • ์ถฉ๋Œ(hash ๊ฐ™์Œ, == ๋‹ค๋ฆ„)
    • ์ •ํ™•์„ฑ์€ ์œ ์ง€๋˜๋‚˜ ์„ฑ๋Šฅ์ด ์•…ํ™”๋  ์ˆ˜ ์žˆ๋‹ค(์ถ”๊ฐ€ ๋น„๊ต/ํƒ์ƒ‰ ์ฆ๊ฐ€).
  • ๋ถˆ์ผ์น˜(== ๊ฐ™์Œ, hash ๋‹ค๋ฆ„)
    • ์ •ํ™•์„ฑ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค(๊ฐ™์€ ํ‚ค๋ฅผ ๋ชป ์ฐพ๊ฑฐ๋‚˜ ์ค‘๋ณต์ฒ˜๋Ÿผ ๋™์ž‘).

์ฆ‰, ์ถฉ๋Œ์€ “์„ฑ๋Šฅ ๋ฌธ์ œ”๊ฐ€ ๋  ์ˆ˜ ์žˆ์ง€๋งŒ, ==/hash ๋ถˆ์ผ์น˜๋Š” “์ •ํ™•์„ฑ ๋ฌธ์ œ”๊ฐ€ ๋œ๋‹ค.


9. String ํ‚ค๋Š” Int ํ‚ค๋ณด๋‹ค ๋ถˆ๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค

iOS ์•ฑ์—์„œ๋Š” Dictionary์˜ ํ‚ค๋กœ String์„ ์“ฐ๋Š” ๊ฒฝ์šฐ๊ฐ€ ํ”ํ•˜๋‹ค.

๋‹ค๋งŒ ๊ฐ™์€ ์กฐํšŒ ํšŸ์ˆ˜/๊ฐ™์€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋ผ๋„, ํ‚ค ํƒ€์ž…์— ๋”ฐ๋ผ ์ฒด๊ฐ ์„ฑ๋Šฅ์ด ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ String ํ‚ค๋Š” Int ํ‚ค๋ณด๋‹ค ๋น„์šฉ์ด ์ปค์งˆ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋‹ค.

 

๊ทธ ์ด์œ ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  • Int๋Š” ๊ณ ์ • ํฌ๊ธฐ ๊ฐ’์ด๋ผ ํ•ด์‹œ ๊ณ„์‚ฐ์ด ๋งค์šฐ ์‹ธ๊ณ , == ๋น„๊ต๋„ ํ•œ ๋ฒˆ์— ๋๋‚œ๋‹ค.
  • String์€ ํ•ด์‹œ ๊ณ„์‚ฐ๊ณผ == ๋น„๊ต๊ฐ€ ๋‚ด์šฉ ๊ธฐ๋ฐ˜์ด๋ผ ๊ธธ์ด/๋‚ด์šฉ์— ๋”ฐ๋ผ ๋” ๋งŽ์€ ๋ฐ”์ดํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•  ์ˆ˜ ์žˆ๋‹ค.
    • String์€ ์œ ๋‹ˆ์ฝ”๋“œ ๊ธฐ๋ฐ˜์˜ ๊ฐ€๋ณ€ ๊ธธ์ด ๋ฌธ์ž์—ด
  • ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•˜๊ฑฐ๋‚˜ ํ›„๋ณด ์—”ํŠธ๋ฆฌ๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ์ผ์ˆ˜๋ก == ๋น„๊ต๊ฐ€ ๋Š˜์–ด๋‚  ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ด๋•Œ String ๋น„๊ต ๋น„์šฉ์ด ๋” ๋ถ€๋‹ด์ด ๋œ๋‹ค.

๋”ฐ๋ผ์„œ ์•„๋ž˜ ๋ฐฉ์‹์œผ๋กœ ๋Œ€์ฒ˜ํ•  ์ˆ˜ ์žˆ๋‹ค.

9-1. ๊ฐ€๋Šฅํ•˜๋ฉด “๊ฐ€๋ฒผ์šด ํ‚ค”๋กœ ๋ฐ”๊พผ๋‹ค

ํ‚ค๊ฐ€ ๋ณธ์งˆ์ ์œผ๋กœ ์‹๋ณ„์ž๋ผ๋ฉด, ๋‚ด๋ถ€ ํ‘œํ˜„์„ Int ๊ฐ™์€ ๊ณ ์ • ํฌ๊ธฐ ๊ฐ’์œผ๋กœ ๋ฐ”๊พธ๋Š” ํŽธ์ด ์œ ๋ฆฌํ•œ ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ๋ฌธ์ž์—ด ID๋ฅผ ์•ฑ ๋‚ด๋ถ€์—์„œ ์ •์ˆ˜ ID๋กœ ๋งคํ•‘ํ•ด Dictionary<Int, …>๋กœ ์šด์šฉํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.

  • ์žฅ์ : ํ•ด์‹œ/๋น„๊ต ๋น„์šฉ์ด ์ค„์–ด ์„ฑ๋Šฅ์ด ์•ˆ์ •์ ์ด๋‹ค.
  • ๋‹จ์ : ๋งคํ•‘ ํ…Œ์ด๋ธ”์„ ๋ณ„๋„๋กœ ๊ด€๋ฆฌํ•ด์•ผ ํ•œ๋‹ค.

9-2. String ํ‚ค๋ฅผ ์œ ์ง€ํ•ด์•ผ ํ•œ๋‹ค๋ฉด “์ •๊ทœํ™”(normalize)”๋ฅผ ๋จผ์ € ํ•œ๋‹ค

๊ฐ™์€ ์˜๋ฏธ์ธ๋ฐ ํ‘œํ˜„์ด ๋‹ค๋ฅธ ๋ฌธ์ž์—ด์ด ์„ž์ด๋ฉด ๋”•์…”๋„ˆ๋ฆฌ๊ฐ€ ์˜๋ฏธ์ ์œผ๋กœ ์ชผ๊ฐœ์ง€๊ณ  lookup์ด ๋Š˜์–ด๋‚œ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ์•„๋ž˜์ฒ˜๋Ÿผ “์˜๋ฏธ๋Š” ๊ฐ™์€๋ฐ ๋ฌธ์ž์—ด๋งŒ ๋‹ค๋ฅธ” ์ผ€์ด์Šค๊ฐ€ ์ƒ๊ธธ ์ˆ˜ ์žˆ๋‹ค.

  • https://a.com/img.png
  • https://a.com/img.png?utm=...
  • https://a.com:443/img.png

์ด ๊ฒฝ์šฐ ๊ฐ™์€ ๋Œ€์ƒ์„ ์„œ๋กœ ๋‹ค๋ฅธ ํ‚ค๋กœ ์ €์žฅํ•ด ์ค‘๋ณต ์ €์žฅ/์ค‘๋ณต ์ž‘์—…์ด ์ƒ๊ธธ ์ˆ˜ ์žˆ๋‹ค.

๊ทธ๋ž˜์„œ ํ‚ค๋กœ ์“ฐ๊ธฐ ์ „์— ํ‘œ์ค€ ํ˜•ํƒœ๋กœ ๋งž์ถ˜๋‹ค.

  • ๋Œ€์†Œ๋ฌธ์ž ํ†ต์ผ(์˜ˆ: lowercased())
  • ๋ถˆํ•„์š” ๊ณต๋ฐฑ ์ œ๊ฑฐ(trim)
  • ํฌ๋งท ํ†ต์ผ(์˜ˆ: ๋‚ ์งœ/๋ฒ„์ „/๊ฒฝ๋กœ ๋ฌธ์ž์—ด์„ ํ•œ ํฌ๋งท์œผ๋กœ ๊ณ ์ •)

์ด ์ž‘์—…์€ ํ•ด์‹œ ์ถฉ๋Œ์„ “์ง์ ‘ ์ค„์ธ๋‹ค”๊ธฐ๋ณด๋‹ค๋Š”, ๊ฐ™์€ ์˜๋ฏธ์˜ ํ‚ค๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ๋กœ ๋ถ„์‚ฐ๋˜๋Š” ๊ฒƒ์„ ๋ง‰์•„ ํžˆํŠธ์œจ๊ณผ ์„ฑ๋Šฅ์„ ์•ˆ์ •ํ™”ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋œ๋‹ค.

9-3. ํ‚ค ์กฐํšŒ๋ณด๋‹ค ๋” ๋น„์‹ผ ์ž‘์—…์ด ์žˆ๋‹ค๋ฉด, ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ์บ์‹œํ•œ๋‹ค

๋งŽ์€ iOS ๋ณ‘๋ชฉ์€ “๋”•์…”๋„ˆ๋ฆฌ ์กฐํšŒ”๋ณด๋‹ค “๋”•์…”๋„ˆ๋ฆฌ ์กฐํšŒ ํ›„ ์ˆ˜ํ–‰๋˜๋Š” ๋น„์‹ผ ์ž‘์—…(ํŒŒ์‹ฑ, ๋ณ€ํ™˜, ๋””์ฝ”๋“œ, ๋ ˆ์ด์•„์›ƒ ๊ณ„์‚ฐ ๋“ฑ)”์—์„œ ๋ฐœ์ƒํ•œ๋‹ค.

์ด ๊ฒฝ์šฐ ํ‚ค ํƒ€์ž…์„ ๋ฐ”๊พธ๊ธฐ ์ „์—, ๋น„์‹ผ ์ž‘์—… ๊ฒฐ๊ณผ๋ฅผ ์บ์‹œํ•˜๋Š” ๊ฒƒ์ด ์ฒด๊ฐ ์„ฑ๋Šฅ์— ๋” ํฌ๊ฒŒ ๊ธฐ์—ฌํ•  ์ˆ˜ ์žˆ๋‹ค.


10. ๊ฒฐ๋ก 

Hashable : Equatable์€ ์˜๋„๋œ ์„ค๊ณ„๋‹ค.

ํ•ด์‹œ๋Š” ์ถฉ๋Œ์ด ๊ฐ€๋Šฅํ•˜๊ณ , Dictionary/Set์€ ์ถฉ๋Œ ์ƒํ™ฉ์—์„œ๋„ ์ •ํ™•ํ•œ ๋™์ž‘์„ ๋ณด์žฅํ•ด์•ผ ํ•œ๋‹ค.

์ด๋ฅผ ์œ„ํ•ด ํ•ด์‹œ๋Š” ํ›„๋ณด๋ฅผ ์ขํžˆ๋Š” ์šฉ๋„๋กœ ์“ฐ๊ณ , ์ตœ์ข… ํ™•์ •์€ ==๋กœ ์ˆ˜ํ–‰ํ•œ๋‹ค.

์ด ์š”๊ตฌ์‚ฌํ•ญ์„ ํƒ€์ž… ์‹œ์Šคํ…œ์—์„œ ๊ฐ•์ œํ•œ ๊ฒฐ๊ณผ๊ฐ€ Hashable์ด Equatable์„ ์ƒ์†ํ•˜๋Š” ๊ตฌ์กฐ๋‹ค.