ํฐ์คํ ๋ฆฌ ๋ทฐ
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์ ์์ํ๋ ๊ตฌ์กฐ๋ค.
'๐ Apple > Swift' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [Swift] Swift์ ํ์ ์บ์คํ (Type Casting) (1) | 2024.06.12 |
|---|---|
| [Swift] ' % ' ์ฐ์ฐ์๋ ๋ชจ๋๋ก๊ฐ ์๋๋ผ ๋๋จธ์ง์ ๋๋ค. (Remainder Operator) (2) | 2024.02.04 |
| [Swift] Docs_(1) The Basics (0) | 2024.01.23 |
- ํ๊ณ
- tipkit
- ๋ชจ๋ฐ์ผ์์ง๋์ด
- Jetsam
- Meet agentic coding in Xcode
- C++
- cs
- 2025๋ ํ๊ณ
- Swift
- page fault
- speculative
- TLB
- ์์ง๋์ด
- ์คํ
- BOJ
- IOS
- 2026๋ ๊ณํ
- spatial locality
- branchless
- ๊ฐ๋ฐ์
- xcode26.3
- temporal locality
- cpu
- ์คํฐ๋
- Memory
- ํ
- 24๋ ํ๊ณ
- Xcode
- ์๋ฃ ๊ตฌ์กฐ
- misprediction
- Total
- Today
- Yesterday