[Go] map์ ๊ตฌ์กฐ
๋ด ๊ฒฝํ์, Go๋ก ์ง ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ฌ๊ฐํ ์ฑ๋ฅ ๋ถํ๋ ๋ฒ๊ทธ๋ฅผ ์ ๋ฐํ๋ ๊ฒ์ ๋๋ถ๋ถ map์ ์๋ชป๋ ์ฌ์ฉ์์ ๋์๋ค.
๋ญ๊ฐ ๊ธฐ๋ณธ ํ์ ์ฒ๋ผ ๊ฐ๋ณ๊ฒ ๋์์ธํด๋์ ์๊ฐ์์ด ์ฐ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์๋ฐ, map์ ๊ทธ๋ฌ๋ฉด ์๋๋ค.
์ฌ์ง์ด Go์์ ๋ฉ์ด์ ํ ๋ชจ๋๋ค๋ map์ ์์์ธ์ฒ๋ผ ์จ์ ๋ฌด์๋ฏธํ ๋ฆฌ์์ค ๋ณ๋ชฉ์ ์ผ์ผํค๋ ๊ฒฝ์ฐ๊ฐ ์ข ์ข ๋ณด์๋ค. ํนํ logrus๋ผ๋ ๋ก๊ฑฐ ๋ชจ๋์ด ๊ทธ๋ฌ๋๋ฐ, ํ๋ ํ ๋นํ ๋๋ง๋ค ๋งต์ ์ ์ฒด ์ฌํ ๋น-๋ฆฌํด์ฑํ๋ ์ ์๊ธฐ์ ์ธ ์ฝ๋๋ฅผ ์ง๋จ๋๋ผ. ๊ทธ๋์ ๋ฒ๋ ธ๋ค.
ํด์ํ ์ด๋ธ
map์ ๊ธฐ๋ณธ์ ์ผ๋ก ํค-๊ฐ์์ ํด์ํ
์ด๋ธ์ด๋ค.
์ฌ๋ฌ๊ฐ์ ๋ฒํท์ ๊ฐ์ง๋ ๋ฆฌ์คํธ๋ก ๊ตฌํ์ด ๋๋ค.
๋ด๋ถ ํ์ดํ์ ๊ฐ๋ก๊ฐ์ด ํด๋์ ์ด๊ฑธ๋ก๋ง ์์๋ณด๊ธฐ๋ ์ด๋ ต๋ค.
๊ทธ๋ฆผ์ผ๋ก ํํํ์๋ฉด, map์ ์ด๋ฐ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๋ค.
map ์์ฒด๋ ์ผ๋จ ํ๋์ ๋ฐฐ์ด์ด๋ค.
ํค๊ฐ์ด ๋ค์ด์ค๋ฉด ๊ทธ๊ฑธ ํด์ฑํด์ ํด์๊ฐ์ ๋ฐฐ์ด ์ธ๋ฑ์ค๋ก ์ผ๊ณ , ๊ฐ์ ๋ด๋ถ์ ์ ์ฅํ ๋ฟ์ด๋ค.
ํด์๋ ๋น์ฐํ ์ถฉ๋ํ ์ ์์ผ๋ฏ๋ก ์์ถฉ์ฅ์น๋ฅผ ๋๋๋ฐ, go์ map์์๋ ๊ทธ๋ฅ ๊ณ ์ ๊ธธ์ด 8์ง๋ฆฌ ๋ฐฐ์ด์ ๋ฒํท์ผ๋ก ์ผ์์ ์ฌ์ด๋๋๋ค. ๊ฝค๋ ์๋ฐํ๊ณ ๊ณ ์ ์ ์ธ ๋ฐฉ์์ด๋ค. ๋ค๋ฅธ ์ธ์ด๋ค์ bucket์ linked list๋ tree๋ฅผ ์ฐ๊ธฐ๋ ํ๋ค.
๊ทธ๋์ go์ map์ ๋ฒํท์ ํ๊ท ๊ธธ์ด๊ฐ 6.5 ์ด์์ด ๋๋ฉด ๋ฏธ์ดํฐ์ง๋๊น ๋ฏธ๋ฆฌ ์ฌํ ๋น์ ์๋ํ๋ค.
growing
map๋ ๋ด๋ถ์ ์ผ๋ก๋ ๊ตฌ์กฐ๊ฐ ๋ฐฐ์ด์ด๋ผ๊ณ ํ๋ค.
๊ทธ๋์ ์ผ๋ง๋ ์ธ์ง๋ฅผ ๋ชจ๋ฅด๋, ํฌ๊ธฐ๋ฅผ ๋ฏธ๋ฆฌ ์ง์ ํ์ง ์์ ๊ฒฝ์ฐ ์ด๊ธฐ๊ฐ์ ์๋ค. ๋ณดํต ๋ฒํท 1๊ฐ๋ก ์์ํ๋ ๊ฒ ๊ฐ๋๋ผ.
๊ทธ๋ฆฌ๊ณ ๊ธธ์ด๊ฐ ๊ฐ๋์ฐจ๋ฉด (ํ๊ท ๊ธธ์ด๊ฐ 6.5 ์ด์์ด ๋๋ฉด), slice์ฒ๋ผ 2๋ฐฐ ํฌ๊ธฐ์ ์๋ก์ด map์ ๋ง๋ค๊ณ ๊ฑฐ๊ธฐ์ ๊ฐ์ ์ฎ๊ธด๋ค.
๊ทผ๋ฐ map์ growing์ slice์ growing๋ณด๋ค ํจ์ฌ ์ฌ๊ฐํ๋ค.
slice๋ ๊ฐ์ copy๋ง ํ๋ฉด ๋์ง๋ง, map์ ๊ฝค๋ ๋ฌด๊ฑฐ์ด ์ฐ์ฐ์ธ hash๋ฅผ ์๋ฉ ๋๋ฆฌ๋ rehashing ๊ณผ์ ์ ๊ฑฐ์ณ์ ์ฎ๊ฒจ์ผ ํ๊ธฐ ๋๋ฌธ์ด๋ค. ์ด๊ฒ ์์ด๋ฉด ๊ฝค๋ ๋ฌด์๋ชปํ ์์ค์ด ๋๋ค.
๊ทธ๋ฐ ์ด์ ์์ ์ด๋ฐ์์ผ๋ก map์ ๋ฌด์์ ๋์ง๊ณ ์๋ ํํ๋ ์ฑ๋ฅ์ ์ข์ ์ฝ๋๊ฐ ๋๊ธฐ ์ด๋ ต๋ค.
์ต์ ์๋ฐฑ-์์ฒ๊ฐ์ ๋ฐ์ดํฐ์
์ ๋ฃ๋๋ฐ ์ด๋ฐ์์ผ๋ก ์ง๋ฉด ํฐ์ ธ๋ ํ ๋ง์ด ์๋ค.
๋๋๋ก ์์ ๊ฐ์ด cap hint๋ฅผ ์ค์ map์ ์์ฑํ๋ ๊ฒ์ด ์ข๋ค. ์ข ์ฌ์ ๋ฅผ ์ค๋ ๋๋ค.
์ด๋ฌ๋ฉด 300๊ฐ์ key-value๊ฐ ๋ค์ด๊ฐ ๊ฒ์ด๋ผ ์ถ์ธกํ๊ณ ์ฌ์ ์๊ฒ map ๊ณต๊ฐ์ ์์ฑํ๊ธฐ ๋๋ฌธ์, ์ ๊ฐ์๋ณด๋ค ๋ง์ง ์๋ค๋ฉด ๋ถํ์ํ growing์ ์ ๋ฐ์ํ์ง ์๊ฒ ๋๋ค.
Go map ๊ตฌํ์ ๋ํ ์ฝ๋๋ฅผ ๋ณด๊ณ ์ถ๋ค๋ฉด ์๋ ๋งํฌ๋ก ๋ค์ด๊ฐ๋ณด๋ฉด ๋๋ค.
https://go.dev/src/runtime/map.go
์ฐธ์กฐ
https://go.dev/blog/maps
https://blog.frec.kr/golang/go-hashtable-0/
https://hackernoon.com/some-insights-on-maps-in-golang-rm5v3ywh