๐ Go ์ธ์ด์ ์ฌ๋ผ์ด์ค์ ๋งต ์ฌ์ธต ๋ถ์ ๐ง

์๋ ํ์ธ์, Go ์ธ์ด ์ด๋ณด์๋ถํฐ ๊ณ ์๊น์ง! ์ค๋์ Go ์ธ์ด์ ํต์ฌ ๋ฐ์ดํฐ ๊ตฌ์กฐ์ธ ์ฌ๋ผ์ด์ค์ ๋งต์ ๋ํด ๊น์ด ํ๊ณ ๋ค์ด๋ณผ ๊ฑฐ์์. ์ด ๊ธ์ ์ฝ๊ณ ๋๋ฉด ์ฌ๋ฌ๋ถ๋ Go ์ธ์ด์ ์ฌ๋ผ์ด์ค์ ๋งต์ ๋ง์คํฐํ ์ ์์ ๊ฑฐ์์! ๐
์ฌ๋ฅ๋ท์์ Go ํ๋ก๊ทธ๋๋ฐ ๊ฐ์๋ฅผ ๋ค์ด๋ณธ ์ ์๋์? ์๋ค๋ฉด ์ง๊ธ์ด ๊ธฐํ์์! ์ฐ๋ฆฌ ํจ๊ป Go์ ๋งค๋ ฅ์ ์ธ ์ธ๊ณ๋ก ๋ ๋๋ณผ๊น์? ๐
๐ก Pro Tip: Go ์ธ์ด๋ฅผ ๋ฐฐ์ฐ๋ ๊ฒ์ ๋จ์ํ ์๋ก์ด ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ฅผ ์ตํ๋ ๊ฒ ์ด์์ ์๋ฏธ๊ฐ ์์ด์. ๋์์ฑ ํ๋ก๊ทธ๋๋ฐ๊ณผ ํจ์จ์ ์ธ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ ๊ฐ์ ํ๋ ์ํํธ์จ์ด ๊ฐ๋ฐ์ ํต์ฌ ๊ฐ๋ ์ ์์ฐ์ค๋ฝ๊ฒ ์ตํ ์ ์๋ต๋๋ค!
๐ ๋ชฉ์ฐจ
- ์ฌ๋ผ์ด์ค (Slice) ๊ธฐ์ด
- ์ฌ๋ผ์ด์ค์ ๋ด๋ถ ๊ตฌ์กฐ
- ์ฌ๋ผ์ด์ค ์กฐ์ํ๊ธฐ
- ๋งต (Map) ๊ธฐ์ด
- ๋งต์ ๋ด๋ถ ๊ตฌ์กฐ
- ๋งต ํ์ฉํ๊ธฐ
- ์ฌ๋ผ์ด์ค์ ๋งต์ ์ฑ๋ฅ ๋น๊ต
- ์ค์ ์์
์, ์ด์ ๋ณธ๊ฒฉ์ ์ผ๋ก ์์ํด๋ณผ๊น์? ๋ฒจํธ ๋งค์ธ์, ์ฌํ์ด ์ข ๊ธธ ์๋ ์์ด์! ใ ใ ใ
๐ฐ ์ฌ๋ผ์ด์ค (Slice) ๊ธฐ์ด
์ฌ๋ผ์ด์ค๋ Go ์ธ์ด์์ ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉ๋๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ ์ค ํ๋์์. ๋ฐฐ์ด๊ณผ ๋น์ทํ์ง๋ง, ํฌ๊ธฐ๊ฐ ๋์ ์ผ๋ก ๋ณํ ์ ์๋ค๋ ์ ์ด ๋ค๋ฅด์ฃ . ๋ง์น ๊ณ ๋ฌด์ค์ฒ๋ผ ๋์๋ค ์ค์๋ค ํ ์ ์์ด์! ๐
๐ Fun Fact: ์ฌ๋ผ์ด์ค์ ์ด๋ฆ์ '์ผ์ดํฌ ํ ์กฐ๊ฐ'์ ์๋ฏธํ๋ ์์ด ๋จ์ด 'slice'์์ ์์ด์. ๋ง์น ์ผ์ดํฌ๋ฅผ ์์ ์์ฌ๋ก ์๋ฅด๋ฏ์ด, ๋ฐ์ดํฐ๋ฅผ ์ ์ฐํ๊ฒ ๋ค๋ฃฐ ์ ์๋ค๋ ์๋ฏธ๋ฅผ ๋ด๊ณ ์์ฃ !
์ฌ๋ผ์ด์ค ์ ์ธํ๊ธฐ
์ฌ๋ผ์ด์ค๋ฅผ ์ ์ธํ๋ ๋ฐฉ๋ฒ์ ์ฌ๋ฌ ๊ฐ์ง๊ฐ ์์ด์. ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ๋ฐฉ๋ฒ๋ถํฐ ์ดํด๋ณผ๊น์?
// ๋น ์ฌ๋ผ์ด์ค ์ ์ธ
var emptySlice []int
// ๋ฆฌํฐ๋ด๋ก ์ฌ๋ผ์ด์ค ์ ์ธ
fruits := []string{"์ฌ๊ณผ", "๋ฐ๋๋", "์ค๋ ์ง"}
// make ํจ์๋ฅผ ์ฌ์ฉํ ์ฌ๋ผ์ด์ค ์ ์ธ
numbers := make([]int, 5, 10) // ๊ธธ์ด 5, ์ฉ๋ 10์ธ ์ฌ๋ผ์ด์ค
์! ์ด๋ ๊ฒ ๋ค์ํ ๋ฐฉ๋ฒ์ผ๋ก ์ฌ๋ผ์ด์ค๋ฅผ ์ ์ธํ ์ ์์ด์. ๋ง์น ์๋ฆฌ์ฌ๊ฐ ์ฌ๋ฌ ๊ฐ์ง ๋๊ตฌ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ฒ๋ผ, ์ํฉ์ ๋ง๊ฒ ์ ์ ํ ๋ฐฉ๋ฒ์ ์ ํํ๋ฉด ๋ผ์. ๐จโ๐ณ
์ฌ๋ผ์ด์ค ์ฌ์ฉํ๊ธฐ
์ฌ๋ผ์ด์ค๋ฅผ ์ ์ธํ๋ค๋ฉด, ์ด์ ์ฌ์ฉํด๋ณผ ์ฐจ๋ก์์. ์ฌ๋ผ์ด์ค๋ ์ธ๋ฑ์ค๋ฅผ ํตํด ์์์ ์ ๊ทผํ ์ ์์ด์.
fruits := []string{"์ฌ๊ณผ", "๋ฐ๋๋", "์ค๋ ์ง"}
fmt.Println(fruits[1]) // "๋ฐ๋๋" ์ถ๋ ฅ
fruits[2] = "ํค์"
fmt.Println(fruits) // [์ฌ๊ณผ ๋ฐ๋๋ ํค์] ์ถ๋ ฅ
์ฌ๋ผ์ด์ค์ ๊ธธ์ด์ ์ฉ๋๋ ์ฝ๊ฒ ํ์ธํ ์ ์์ด์.
fmt.Println(len(fruits)) // 3 ์ถ๋ ฅ (๊ธธ์ด)
fmt.Println(cap(fruits)) // 3 ์ถ๋ ฅ (์ฉ๋)
๐ก Pro Tip: ์ฌ๋ผ์ด์ค์ ๊ธธ์ด(length)์ ์ฉ๋(capacity)์ ๋ค๋ฅธ ๊ฐ๋ ์ด์์. ๊ธธ์ด๋ ํ์ฌ ์ฌ๋ผ์ด์ค์ ๋ค์ด์๋ ์์์ ์๋ฅผ, ์ฉ๋์ ์ฌ๋ผ์ด์ค๊ฐ ์ค์ ๋ก ์ ์ฅํ ์ ์๋ ์ต๋ ์์์ ์๋ฅผ ๋ํ๋ด์. ๋ง์น ๋ฌผ๋ณ์ ํ์ฌ ๋ฌผ์ ์๊ณผ ๋ฌผ๋ณ์ ์ต๋ ์ฉ๋์ ์ฐจ์ด์ ๋น์ทํ์ฃ !
์ฌ๋ผ์ด์ฑ (Slicing)
์ฌ๋ผ์ด์ค์ ์ง์ง ๋งค๋ ฅ์ ๋ฐ๋ก ์ฌ๊ธฐ์ ์์ด์! ์ฌ๋ผ์ด์ฑ์ ํตํด ๊ธฐ์กด ์ฌ๋ผ์ด์ค์ ์ผ๋ถ๋ถ๋ง ์ ํํด์ ์๋ก์ด ์ฌ๋ผ์ด์ค๋ฅผ ๋ง๋ค ์ ์์ด์.
numbers := []int{0, 1, 2, 3, 4, 5}
slice1 := numbers[2:4] // [2, 3]
slice2 := numbers[:3] // [0, 1, 2]
slice3 := numbers[3:] // [3, 4, 5]
์ด๋ ๊ฒ ์ฌ๋ผ์ด์ฑ์ ํ๋ฉด, ์๋ณธ ์ฌ๋ผ์ด์ค์ ๋ฐ์ดํฐ๋ฅผ ๊ณต์ ํ๋ฉด์ ์๋ก์ด ๋ทฐ๋ฅผ ๋ง๋ค ์ ์์ด์. ๋ง์น ๊ฐ์ ํ๊ฒฝ์ ๋ค๋ฅธ ๊ฐ๋์์ ๋ณด๋ ๊ฒ์ฒ๋ผ์! ๐ธ
์ฌ๋ผ์ด์ฑ์ ์ ๋ง ํธ๋ฆฌํ์ง๋ง, ์ฃผ์ํด์ผ ํ ์ ๋ ์์ด์. ์ฌ๋ผ์ด์ฑ์ผ๋ก ๋ง๋ ์ ์ฌ๋ผ์ด์ค๋ ์๋ณธ ์ฌ๋ผ์ด์ค์ ๋ฐ์ดํฐ๋ฅผ ๊ณต์ ํ๊ธฐ ๋๋ฌธ์, ์ ์ฌ๋ผ์ด์ค๋ฅผ ์์ ํ๋ฉด ์๋ณธ ์ฌ๋ผ์ด์ค๋ ํจ๊ป ๋ณ๊ฒฝ๋ ์ ์์ด์. ์ด๊ฑด ๋ง์น ํธ์ ํ ๋ ํ์ ๊ฐ์ ๊ฑฐ์ฃ ! ๐ฏโโ๏ธ
์ฌ๋ผ์ด์ค ํ์ฅํ๊ธฐ
์ฌ๋ผ์ด์ค์ ๋ ๋ค๋ฅธ ๋ฉ์ง ํน์ง์ ๋ฐ๋ก ๋์ ์ผ๋ก ํฌ๊ธฐ๋ฅผ ์กฐ์ ํ ์ ์๋ค๋ ๊ฑฐ์์. append ํจ์๋ฅผ ์ฌ์ฉํ๋ฉด ์ฌ๋ผ์ด์ค์ ์๋ก์ด ์์๋ฅผ ์ถ๊ฐํ ์ ์์ด์.
fruits := []string{"์ฌ๊ณผ", "๋ฐ๋๋"}
fruits = append(fruits, "์ค๋ ์ง")
fmt.Println(fruits) // [์ฌ๊ณผ ๋ฐ๋๋ ์ค๋ ์ง] ์ถ๋ ฅ
append๋ ์ ๋ง ๊ฐ๋ ฅํ ๋๊ตฌ์์. ์ฌ๋ฌ ๊ฐ์ ์์๋ฅผ ํ ๋ฒ์ ์ถ๊ฐํ ์๋ ์๊ณ , ๋ค๋ฅธ ์ฌ๋ผ์ด์ค์ ๋ชจ๋ ์์๋ฅผ ํ์ฌ ์ฌ๋ผ์ด์ค์ ์ถ๊ฐํ ์๋ ์์ด์.
fruits = append(fruits, "ํค์", "๋ง๊ณ ")
moreFruits := []string{"ํ์ธ์ ํ", "๋ธ๊ธฐ"}
fruits = append(fruits, moreFruits...)
fmt.Println(fruits) // [์ฌ๊ณผ ๋ฐ๋๋ ์ค๋ ์ง ํค์ ๋ง๊ณ ํ์ธ์ ํ ๋ธ๊ธฐ] ์ถ๋ ฅ
์์ฐ! ์ด๋ ๊ฒ ์ฌ๋ผ์ด์ค๋ ๋ง์น ๋ง๋ฒ ์ฃผ๋จธ๋์ฒ๋ผ ๊ณ์ํด์ ์๋ก์ด ๊ฒ๋ค์ ๋ด์ ์ ์์ด์. ๐ฉโจ
๐ฑ Growth Mindset: ์ฌ๋ผ์ด์ค๋ฅผ ๋ง์คํฐํ๋ ๊ฒ์ Go ํ๋ก๊ทธ๋๋ฐ์ ์ฒซ ๊ฑธ์์ด์์. ์ฌ๋ฅ๋ท์์ ์ ๊ณตํ๋ Go ํ๋ก๊ทธ๋๋ฐ ๊ฐ์ข๋ฅผ ํตํด ๋ ๊น์ด ์๋ ์ง์์ ์์๋ณด๋ ๊ฑด ์ด๋จ๊น์? ์ง์์ ๋๋๋ฉด ๋ฐฐ๊ฐ ๋๋ค๊ณ ํ์์์!
์, ์ด์ ์ฌ๋ผ์ด์ค์ ๊ธฐ๋ณธ์ ์์๋ดค์ด์. ํ์ง๋ง ์ด๊ฒ ๋์ด ์๋์์! ์ฌ๋ผ์ด์ค์ ๋ด๋ถ ๊ตฌ์กฐ๋ฅผ ์ดํดํ๋ฉด, ๋์ฑ ํจ์จ์ ์ผ๋ก ์ฌ์ฉํ ์ ์๋ต๋๋ค. ๋ค์ ์น์ ์์ ๊ณ์ํด์ ์์๋ณผ๊น์? ๐
๐ฌ ์ฌ๋ผ์ด์ค์ ๋ด๋ถ ๊ตฌ์กฐ
์, ์ด์ ์ฌ๋ผ์ด์ค์ ๋ด๋ถ๋ก ๋ค์ด๊ฐ๋ณผ ์๊ฐ์ด์์! ๋ง์น ํ๋ฏธ๊ฒฝ์ผ๋ก ์ธํฌ๋ฅผ ๋ค์ฌ๋ค๋ณด๋ ๊ฒ์ฒ๋ผ, ์ฌ๋ผ์ด์ค์ ๋ด๋ถ ๊ตฌ์กฐ๋ฅผ ์์ธํ ์ดํด๋ณผ ๊ฑฐ์์. ์ค๋น๋์ จ๋์? ๐ต๏ธโโ๏ธ
์ฌ๋ผ์ด์ค์ 3๊ฐ์ง ์์
์ฌ๋ผ์ด์ค๋ ๊ฒ์ผ๋ก ๋ณด๊ธฐ์๋ ๋จ์ํด ๋ณด์ด์ง๋ง, ๋ด๋ถ์ ์ผ๋ก๋ ๊ฝค ๋ณต์กํ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๊ณ ์์ด์. ์ฌ๋ผ์ด์ค๋ ๋ค์ ์ธ ๊ฐ์ง ์์๋ก ๊ตฌ์ฑ๋์ด ์๋ต๋๋ค:
- ํฌ์ธํฐ (Pointer)
- ๊ธธ์ด (Length)
- ์ฉ๋ (Capacity)
์ด ์ธ ๊ฐ์ง ์์๊ฐ ์ด๋ป๊ฒ ์๋ํ๋์ง ์์ธํ ์์๋ณผ๊น์?
1. ํฌ์ธํฐ (Pointer)
ํฌ์ธํฐ๋ ์ฌ๋ผ์ด์ค์ ์ฒซ ๋ฒ์งธ ์์๊ฐ ์ ์ฅ๋ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ ๊ฐ๋ฆฌ์ผ์. ์ด๊ฒ์ ๋ง์น ์ฑ ์ ์ฒซ ํ์ด์ง๋ฅผ ์๊ฐ๋ฝ์ผ๋ก ๊ฐ๋ฆฌํค๋ ๊ฒ๊ณผ ๋น์ทํด์. ์ด ํฌ์ธํฐ๋ฅผ ํตํด Go๋ ์ฌ๋ผ์ด์ค์ ์ค์ ๋ฐ์ดํฐ๊ฐ ์ด๋์ ์๋์ง ์ ์ ์์ด์.
2. ๊ธธ์ด (Length)
๊ธธ์ด๋ ํ์ฌ ์ฌ๋ผ์ด์ค์ ํฌํจ๋ ์์์ ๊ฐ์๋ฅผ ๋ํ๋ด์. ์ด๋ len()
ํจ์๋ก ํ์ธํ ์ ์์ฃ . ๊ธธ์ด๋ ์ฌ๋ผ์ด์ค์ ์ผ๋ง๋ ๋ง์ ๋ฐ์ดํฐ๊ฐ ๋ค์ด์๋์ง ์๋ ค์ฃผ๋ ์ค์ํ ์ ๋ณด์์.
3. ์ฉ๋ (Capacity)
์ฉ๋์ ํ์ฌ ์ฌ๋ผ์ด์ค๊ฐ ๊ฐ๋ฆฌํค๋ ๋ฐฐ์ด์ด ์ค์ ๋ก ๋ณด์ ํ ์ ์๋ ์ต๋ ์์์ ๊ฐ์๋ฅผ ๋ํ๋ด์. ์ด๋ cap()
ํจ์๋ก ํ์ธํ ์ ์์ด์. ์ฉ๋์ ์ฌ๋ผ์ด์ค๊ฐ ์ผ๋ง๋ ๋ ์ฑ์ฅํ ์ ์๋์ง๋ฅผ ๋ณด์ฌ์ฃผ๋ ์งํ์์.
์ด ๊ทธ๋ฆผ์ ๋ณด๋ฉด ์ฌ๋ผ์ด์ค์ ๊ตฌ์กฐ๊ฐ ์ข ๋ ๋ช ํํด์ง์ฃ ? ํฌ์ธํฐ๋ ์ค์ ๋ฐ์ดํฐ๊ฐ ์๋ ๋ฐฐ์ด์ ์์์ ์ ๊ฐ๋ฆฌํค๊ณ , ๊ธธ์ด๋ ํ์ฌ ์ฌ์ฉ ์ค์ธ ์์์ ์, ์ฉ๋์ ์ ์ฒด ๋ฐฐ์ด์ ํฌ๊ธฐ๋ฅผ ๋ํ๋ด์. ๋ง์น ์์ด์คํฌ๋ฆผ ์ฝ์ ์๊ฐํด๋ณด์ธ์. ํฌ์ธํฐ๋ ์์ด์คํฌ๋ฆผ์ ์์์ , ๊ธธ์ด๋ ํ์ฌ ๋จน์ ์, ์ฉ๋์ ์ฝ์ ๋ด์ ์ ์๋ ์ ์ฒด ์์ด์คํฌ๋ฆผ์ ์์ด๋ผ๊ณ ํ ์ ์์ด์! ๐ฆ
์ฌ๋ผ์ด์ค์ ๋์ ์๋ฆฌ
์ด์ ์ฌ๋ผ์ด์ค์ ๊ตฌ์กฐ๋ฅผ ์์์ผ๋, ์ด๋ป๊ฒ ๋์ํ๋์ง ์์ธํ ์ดํด๋ณผ๊น์?
์ฌ๋ผ์ด์ค ์์ฑ
์ฌ๋ผ์ด์ค๋ฅผ ์์ฑํ ๋, Go๋ ๋ด๋ถ์ ์ผ๋ก ๋ฐฐ์ด์ ๋ง๋ค๊ณ ๊ทธ ๋ฐฐ์ด์ ๊ฐ๋ฆฌํค๋ ์ฌ๋ผ์ด์ค ๊ตฌ์กฐ์ฒด๋ฅผ ์์ฑํด์.
fruits := []string{"์ฌ๊ณผ", "๋ฐ๋๋", "์ค๋ ์ง"}
์ด ์ฝ๋๋ฅผ ์คํํ๋ฉด, Go๋ ๋ค์๊ณผ ๊ฐ์ ์์ ์ ์ํํด์:
- 3๊ฐ์ ๋ฌธ์์ด์ ์ ์ฅํ ์ ์๋ ๋ฐฐ์ด์ ๋ฉ๋ชจ๋ฆฌ์ ์์ฑ
- ์ฌ๋ผ์ด์ค ๊ตฌ์กฐ์ฒด ์์ฑ (ํฌ์ธํฐ๋ ๋ฐฐ์ด์ ์์์ ์ ๊ฐ๋ฆฌํด)
- ๊ธธ์ด์ ์ฉ๋์ 3์ผ๋ก ์ค์
์ฌ๋ผ์ด์ค ํ์ฅ
์ฌ๋ผ์ด์ค์ ์๋ก์ด ์์๋ฅผ ์ถ๊ฐํ ๋, Go๋ ํ์ฌ ์ฉ๋์ ์ฒดํฌํด์. ๋ง์ฝ ํ์ฌ ์ฉ๋์ผ๋ก ์ ์์๋ฅผ ์์ฉํ ์ ์๋ค๋ฉด, ๋ ํฐ ๋ฐฐ์ด์ ์๋ก ๋ง๋ค๊ณ ๊ธฐ์กด ๋ฐ์ดํฐ๋ฅผ ๋ณต์ฌํ ํ, ์ฌ๋ผ์ด์ค์ ํฌ์ธํฐ๋ฅผ ์ ๋ฐฐ์ด๋ก ๋ณ๊ฒฝํด์.
fruits = append(fruits, "ํค์")
์ด ๊ณผ์ ์ ๋ง์น ์ท์ฅ์ด ๊ฝ ์ฐจ์ ๋ ํฐ ์ท์ฅ์ผ๋ก ์ด์ฌํ๋ ๊ฒ๊ณผ ๋น์ทํด์. ๋ชจ๋ ์ท(๋ฐ์ดํฐ)์ ์ ์ท์ฅ(์ ๋ฐฐ์ด)์ผ๋ก ์ฎ๊ธฐ๊ณ , ์ฃผ์(ํฌ์ธํฐ)๋ฅผ ์ ๋ฐ์ดํธํ๋ ๊ฑฐ์ฃ ! ๐งณ
๐ก Pro Tip: Go์ ์ฌ๋ผ์ด์ค ํ์ฅ ์๊ณ ๋ฆฌ์ฆ์ ๋งค์ฐ ํจ์จ์ ์ด์์. ์ ๋ฐฐ์ด์ ๋ง๋ค ๋, ๋ณดํต ํ์ฌ ์ฉ๋์ 2๋ฐฐ ํฌ๊ธฐ๋ก ๋ง๋ค์ด์. ์ด๋ ๊ฒ ํ๋ฉด ์ฆ์ ๋ฉ๋ชจ๋ฆฌ ํ ๋น์ ํผํ ์ ์์ด ์ฑ๋ฅ์ด ํฅ์๋ผ์!
์ฌ๋ผ์ด์ฑ ์์
์ฌ๋ผ์ด์ฑ์ ํ ๋, ์๋ก์ด ๋ฉ๋ชจ๋ฆฌ ํ ๋น์ ์ผ์ด๋์ง ์์์. ๋์ , ๊ธฐ์กด ๋ฐฐ์ด์ ์ผ๋ถ๋ฅผ ๊ฐ๋ฆฌํค๋ ์๋ก์ด ์ฌ๋ผ์ด์ค ๊ตฌ์กฐ์ฒด๊ฐ ์์ฑ๋ผ์.
subSlice := fruits[1:3]
์ด ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ์ ์์ ์ ์ํํด์:
- ์๋ก์ด ์ฌ๋ผ์ด์ค ๊ตฌ์กฐ์ฒด ์์ฑ
- ํฌ์ธํฐ๋ฅผ fruits[1]์ ์ฃผ์๋ก ์ค์
- ๊ธธ์ด๋ฅผ 2๋ก ์ค์ (3 - 1 = 2)
- ์ฉ๋์ ์๋ณธ ์ฌ๋ผ์ด์ค์ ๋จ์ ์ฉ๋์ผ๋ก ์ค์
์ด๊ฒ์ ๋ง์น ์ฑ ์ ํน์ ํ์ด์ง์ ์ฑ ๊ฐํผ๋ฅผ ๊ฝ๋ ๊ฒ๊ณผ ๋น์ทํด์. ์ ์ฑ ์ ๋ง๋๋ ๊ฒ ์๋๋ผ, ๊ธฐ์กด ์ฑ ์ ํน์ ๋ถ๋ถ์ ๊ฐ๋ฆฌํค๋ ๊ฑฐ์ฃ ! ๐
์ฌ๋ผ์ด์ค์ ๋ด๋ถ ๊ตฌ์กฐ๊ฐ ์ค์ํ ์ด์
์ฌ๋ผ์ด์ค์ ๋ด๋ถ ๊ตฌ์กฐ๋ฅผ ์ดํดํ๋ ๊ฒ์ ๋จ์ํ ์ง์์ ์๋ ๊ฒ ์ด์์ ์๋ฏธ๊ฐ ์์ด์. ์ด๋ฅผ ํตํด ์ฐ๋ฆฌ๋:
- ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ ํจ์จ์ ์ผ๋ก ์ฌ์ฉํ ์ ์์ด์.
- ์ฑ๋ฅ ์ต์ ํ๋ฅผ ํ ์ ์์ด์.
- ์์์น ๋ชปํ ๋ฒ๊ทธ๋ฅผ ๋ฐฉ์งํ ์ ์์ด์.
์๋ฅผ ๋ค์ด, ํฐ ์ฌ๋ผ์ด์ค์ ์์ ๋ถ๋ถ๋ง ํ์ํ ๋ ์ ์ฒด๋ฅผ ๋ณต์ฌํ๋ ๋์ ์ฌ๋ผ์ด์ฑ์ ์ฌ์ฉํ๋ฉด ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ํฌ๊ฒ ์ค์ผ ์ ์์ด์. ๋ํ, append ์ฐ์ฐ์ด ์ ๋ฐฐ์ด์ ๋ง๋ค์ด๋ด๋ ์์ ์ ์์ธกํ ์ ์์ด ์ฑ๋ฅ ์ต์ ํ์๋ ๋์์ด ๋ผ์.
๐ Fun Fact: Go ์ธ์ด์ ์ฌ๋ผ์ด์ค ๊ตฌํ์ ์ ๋ง ๋๋ํด์! ๋ด๋ถ์ ์ผ๋ก ์ต์ ํ๊ฐ ์ ๋์ด ์์ด์, ๋๋ถ๋ถ์ ๊ฒฝ์ฐ ์ฐ๋ฆฌ๊ฐ ์ง์ ์ต์ ํ๋ฅผ ํ๋ ๊ฒ๋ณด๋ค Go์ ๊ธฐ๋ณธ ๊ตฌํ์ ๋ฏฟ๊ณ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ ์ข์ ๊ฒฐ๊ณผ๋ฅผ ๋ผ ์ ์์ด์. Go ๊ฐ๋ฐ์๋ค, ์ง์ง ์ฒ์ฌ ์๋๊ฐ์? ๐
์ฌ๋ผ์ด์ค์ ๋ด๋ถ ๊ตฌ์กฐ๋ฅผ ์ดํดํ๋ ๊ฒ์ ๋ง์น ์๋์ฐจ์ ์์ง์ ์ดํดํ๋ ๊ฒ๊ณผ ๊ฐ์์. ๊ฒ์์ ๋ณด๊ธฐ์๋ ๋จ์ํด ๋ณด์ด์ง๋ง, ๋ด๋ถ๋ ์ ๊ตํ๊ณ ํจ์จ์ ์ธ ๋ฉ์ปค๋์ฆ์ผ๋ก ๊ฐ๋ ์ฐจ ์์ฃ . ์ด๋ฐ ์ง์์ ๋ฐํ์ผ๋ก Go ํ๋ก๊ทธ๋๋ฐ์ ํ๋ฉด, ์ฌ๋ฌ๋ถ์ ์ฝ๋๋ ๋์ฑ ๊ฐ๋ ฅํ๊ณ ํจ์จ์ ์ด ๋ ๊ฑฐ์์! ๐ช
์, ์ด์ ์ฌ๋ผ์ด์ค์ ๋ด๋ถ๊น์ง ๊น์ด ๋ค์ฌ๋ค๋ดค์ด์. ์ด๋ ์ ๊ฐ์? ์กฐ๊ธ์ ๋ณต์กํด ๋ณด์ผ ์ ์์ง๋ง, ์ดํดํ๊ณ ๋๋ฉด ์ ๋ง ๋ฉ์ง ๋๊ตฌ๋ผ๋ ๊ฑธ ๋๋ ์ ์์ ๊ฑฐ์์. ๋ค์ ์น์ ์์๋ ์ด๋ฐ ์ง์์ ๋ฐํ์ผ๋ก ์ฌ๋ผ์ด์ค๋ฅผ ์ค์ ๋ก ์ด๋ป๊ฒ ํ์ฉํ๋์ง ์์๋ณผ ๊ฑฐ์์. ์ฌ๋ฅ๋ท์์ ๋ฐฐ์ด Go ํ๋ก๊ทธ๋๋ฐ ์คํฌ์ ํ์ธต ๋ ์ ๊ทธ๋ ์ด๋ํ ์ค๋น ๋์ จ๋์? Let's Go! ๐
๐ ์ฌ๋ผ์ด์ค ์กฐ์ํ๊ธฐ
์, ์ด์ ์ฌ๋ผ์ด์ค์ ๊ธฐ๋ณธ ๊ฐ๋ ๊ณผ ๋ด๋ถ ๊ตฌ์กฐ๋ฅผ ์์์ผ๋, ์ค์ ๋ก ์ด๋ป๊ฒ ํ์ฉํ๋์ง ์์๋ณผ ์ฐจ๋ก์์! ์ฌ๋ผ์ด์ค๋ฅผ ์์ ์์ฌ๋ก ๋ค๋ฃจ๋ ๋ฒ์ ๋ฐฐ์ฐ๋ฉด, Go ํ๋ก๊ทธ๋๋ฐ์ ์ง์ ํ ๋ง์คํฐ๊ฐ ๋ ์ ์์ด์. ์ค๋น๋์ จ๋์? ๐
1. ์ฌ๋ผ์ด์ค ์์ฑํ๊ธฐ
์ฌ๋ผ์ด์ค๋ฅผ ์์ฑํ๋ ๋ฐฉ๋ฒ์ ์ฌ๋ฌ ๊ฐ์ง๊ฐ ์์ด์. ์ํฉ์ ๋ฐ๋ผ ๊ฐ์ฅ ์ ์ ํ ๋ฐฉ๋ฒ์ ์ ํํ๋ฉด ๋ผ์.
// ๋ฆฌํฐ๋ด๋ก ์์ฑ
fruits := []string{"์ฌ๊ณผ", "๋ฐ๋๋", "์ค๋ ์ง"}
// make ํจ์ ์ฌ์ฉ
numbers := make([]int, 5, 10) // ๊ธธ์ด 5, ์ฉ๋ 10
// ๋น ์ฌ๋ผ์ด์ค ์์ฑ
emptySlice := []int{}
// nil ์ฌ๋ผ์ด์ค
var nilSlice []int
nil ์ฌ๋ผ์ด์ค์ ๋น ์ฌ๋ผ์ด์ค๋ ๋ค๋ฅด๋ค๋ ์ ์ ๊ธฐ์ตํ์ธ์! nil ์ฌ๋ผ์ด์ค๋ ์์ ํ ์ด๊ธฐํ๋์ง ์์ ์ํ์ด๊ณ , ๋น ์ฌ๋ผ์ด์ค๋ ๊ธธ์ด์ ์ฉ๋์ด 0์ธ ์ฌ๋ผ์ด์ค์์.
๐ก Pro Tip: ๋๋ถ๋ถ์ ๊ฒฝ์ฐ ๋น ์ฌ๋ผ์ด์ค []int{}
๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด nil ์ฌ๋ผ์ด์ค๋ณด๋ค ์์ ํด์. nil ์ฒดํฌ๋ฅผ ๋ฐ๋ก ํ์ง ์์๋ ๋๊ฑฐ๋ ์!
2. ์ฌ๋ผ์ด์ค์ ์์ ์ถ๊ฐํ๊ธฐ
์ฌ๋ผ์ด์ค์ ์๋ก์ด ์์๋ฅผ ์ถ๊ฐํ ๋๋ append
ํจ์๋ฅผ ์ฌ์ฉํด์. ์ด ํจ์๋ ์ ๋ง ๊ฐ๋ ฅํ๊ณ ์ ์ฐํด์ ๋ค์ํ ๋ฐฉ์์ผ๋ก ์ฌ์ฉํ ์ ์์ด์.
fruits := []string{"์ฌ๊ณผ", "๋ฐ๋๋"}
// ๋จ์ผ ์์ ์ถ๊ฐ
fruits = append(fruits, "์ค๋ ์ง")
// ์ฌ๋ฌ ์์ ํ ๋ฒ์ ์ถ๊ฐ
fruits = append(fruits, "ํค์", "๋ง๊ณ ")
// ๋ค๋ฅธ ์ฌ๋ผ์ด์ค์ ๋ชจ๋ ์์ ์ถ๊ฐ
moreFruits := []string{"ํ์ธ์ ํ", "๋ธ๊ธฐ"}
fruits = append(fruits, moreFruits...)
fmt.Println(fruits)
// ์ถ๋ ฅ: [์ฌ๊ณผ ๋ฐ๋๋ ์ค๋ ์ง ํค์ ๋ง๊ณ ํ์ธ์ ํ ๋ธ๊ธฐ]
append ํจ์๋ ํญ์ ์๋ก์ด ์ฌ๋ผ์ด์ค๋ฅผ ๋ฐํํ๋ค๋ ์ ์ ๊ธฐ์ตํ์ธ์. ์๋ณธ ์ฌ๋ผ์ด์ค๊ฐ ์์ ๋๋ ๊ฒ ์๋๋ผ, ์๋ก์ด ์ฌ๋ผ์ด์ค๊ฐ ๋ง๋ค์ด์ง๋ ๊ฑฐ์์.
3. ์ฌ๋ผ์ด์ค ์๋ฅด๊ธฐ (Slicing)
์ฌ๋ผ์ด์ค์ ์ผ๋ถ๋ถ๋ง ์ ํํ๊ณ ์ถ์ ๋๋ ์ฌ๋ผ์ด์ฑ์ ์ฌ์ฉํด์. ์ด๋ ๋งค์ฐ ์ ์ฉํ ๊ธฐ๋ฅ์ด์์!
numbers := []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
// ์ธ๋ฑ์ค 2๋ถํฐ 5 ์ด์ ๊น์ง
slice1 := numbers[2:5] // [2, 3, 4]
// ์ฒ์๋ถํฐ ์ธ๋ฑ์ค 4 ์ด์ ๊น์ง
slice2 := numbers[:4] // [0, 1, 2, 3]
// ์ธ๋ฑ์ค 6๋ถํฐ ๋๊น์ง
slice3 := numbers[6:] // [6, 7, 8, 9]
// ์ ์ฒด ์ฌ๋ผ์ด์ค
slice4 := numbers[:] // [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
๐ Fun Fact: ์ฌ๋ผ์ด์ฑ์ ํ์ด์ฌ์ ๋ฆฌ์คํธ ์ฌ๋ผ์ด์ฑ๊ณผ ๋งค์ฐ ์ ์ฌํด์. ํ์ด์ฌ ๊ฒฝํ์ด ์๋ค๋ฉด, ์ด ๊ฐ๋ ์ ์ฝ๊ฒ ์ดํดํ ์ ์์ ๊ฑฐ์์!
4. ์ฌ๋ผ์ด์ค ๋ณต์ฌํ๊ธฐ
๋๋ก๋ ์ฌ๋ผ์ด์ค์ ์์ ํ ๋ณต์ฌ๋ณธ์ด ํ์ํ ๋๊ฐ ์์ด์. ์ด๋ด ๋๋ copy
ํจ์๋ฅผ ์ฌ์ฉํ๋ฉด ๋ผ์.
original := []int{1, 2, 3, 4, 5}
copied := make([]int, len(original))
copy(copied, original)
fmt.Println(copied) // [1, 2, 3, 4, 5]
copy ํจ์๋ ๋ ์ฌ๋ผ์ด์ค ์ค ๋ ์งง์ ๊ฒ์ ๊ธธ์ด๋งํผ๋ง ๋ณต์ฌํ๋ค๋ ์ ์ ์ฃผ์ํ์ธ์. ์์ ํ ๋ณต์ฌ๋ฅผ ์ํด์๋ ๋์ ์ฌ๋ผ์ด์ค์ ๊ธธ์ด๊ฐ ์ถฉ๋ถํด์ผ ํด์.
5. ์ฌ๋ผ์ด์ค ์ ๋ ฌํ๊ธฐ
Go์ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์ฌ๋ผ์ด์ค๋ฅผ ์ฝ๊ฒ ์ ๋ ฌํ ์ ์๋ ๊ธฐ๋ฅ์ ์ ๊ณตํด์.
import "sort"
numbers := []int{5, 2, 6, 3, 1, 4}
sort.Ints(numbers)
fmt.Println(numbers) // [1, 2, 3, 4, 5, 6]
fruits := []string{"๋ฐ๋๋", "์ฌ๊ณผ", "ํค์", "์ค๋ ์ง"}
sort.Strings(fruits)
fmt.Println(fruits) // [๋ฐ๋๋ ์ฌ๊ณผ ์ค๋ ์ง ํค์]
์ปค์คํ
์ ๋ ฌ๋ ๊ฐ๋ฅํด์. sort.Slice
ํจ์๋ฅผ ์ฌ์ฉํ๋ฉด ์ํ๋ ๋๋ก ์ ๋ ฌ ๊ธฐ์ค์ ์ ํ ์ ์์ด์.
type Person struct {
Name string
Age int
}
people := []Person{
{"Alice", 25},
{"Bob", 30},
{"Charlie", 22},
}
sort.Slice(people, func(i, j int) bool {
return people[i].Age < people[j].Age
})
fmt.Println(people)
// [{Charlie 22} {Alice 25} {Bob 30}]
6. ์ฌ๋ผ์ด์ค ํํฐ๋ง
Go์๋ ๊ธฐ๋ณธ์ ์ผ๋ก filter ํจ์๊ฐ ์์ง๋ง, ์ฝ๊ฒ ๊ตฌํํ ์ ์์ด์.
numbers := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
evenNumbers := make([]int, 0)
for _, num := range numbers {
if num%2 == 0 {
evenNumbers = append(evenNumbers, num)
}
}
fmt.Println(evenNumbers) // [2, 4, 6, 8, 10]
7. ์ฌ๋ผ์ด์ค์ ์ฉ๋ ๊ด๋ฆฌ
์ฌ๋ผ์ด์ค์ ์ฉ๋์ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ๋ฉด ์ฑ๋ฅ์ ํฌ๊ฒ ํฅ์์ํฌ ์ ์์ด์.
// ์ฉ๋์ ๋ฏธ๋ฆฌ ํ ๋น
numbers := make([]int, 0, 1000)
// ์ฉ๋์ด ๋ถ์กฑํ ๋๋ง๋ค 2๋ฐฐ์ฉ ์ฆ๊ฐ
for i := 0; i < 2000; i++ {
if len(numbers) == cap(numbers) {
newNumbers := make([]int, len(numbers), 2*cap(numbers))
copy(newNumbers, numbers)
numbers = newNumbers
}
numbers = append(numbers, i)
}
๐ก Pro Tip: ์ฌ๋ผ์ด์ค์ ํฌ๊ธฐ๋ฅผ ๋ฏธ๋ฆฌ ์๊ณ ์๋ค๋ฉด, make ํจ์๋ก ์ฉ๋์ ๋ฏธ๋ฆฌ ํ ๋นํ๋ ๊ฒ์ด ์ข์์. ์ด๋ ๊ฒ ํ๋ฉด ๋ถํ์ํ ๋ฉ๋ชจ๋ฆฌ ์ฌํ ๋น์ ํผํ ์ ์์ด ์ฑ๋ฅ์ด ํฅ์๋ผ์!
์ค์ ์์ : ์ฌ๋ผ์ด์ค๋ฅผ ํ์ฉํ ๊ฐ๋จํ TODO ๋ฆฌ์คํธ
์ด์ ์ฐ๋ฆฌ๊ฐ ๋ฐฐ์ด ๋ด์ฉ์ ํ์ฉํด์ ๊ฐ๋จํ TODO ๋ฆฌ์คํธ๋ฅผ ๋ง๋ค์ด๋ณผ๊น์?
package main
import (
"fmt"
"sort"
)
type Task struct {
Description string
Done bool
}
func main() {
todoList := []Task{}
// ํ์คํฌ ์ถ๊ฐ
todoList = append(todoList, Task{"Go ๊ณต๋ถํ๊ธฐ", false})
todoList = append(todoList, Task{"์ด๋ํ๊ธฐ", false})
todoList = append(todoList, Task{"์ฌ๋ฅ๋ท์์ ๊ฐ์ ๋ฃ๊ธฐ", false})
// ํ์คํฌ ์๋ฃ ์ฒ๋ฆฌ
todoList[1].Done = true
// ์๋ฃ๋์ง ์์ ํ์คํฌ๋ง ํํฐ๋ง
unfinishedTasks := []Task{}
for _, task := range todoList {
if !task.Done {
unfinishedTasks = append(unfinishedTasks, task)
}
}
// ํ์คํฌ ์ ๋ ฌ (์ค๋ช
๊ธฐ์ค)
sort.Slice(unfinishedTasks, func(i, j int) bool {
return unfinishedTasks[i].Description < unfinishedTasks[j].Description
})
// ๊ฒฐ๊ณผ ์ถ๋ ฅ
fmt.Println("๋ฏธ์๋ฃ ํ์คํฌ:")
for _, task := range unfinishedTasks {
fmt.Printf("- %s\n", task.Description)
}
}
์ด ์์ ์์๋ ์ฌ๋ผ์ด์ค๋ฅผ ์ฌ์ฉํด ํ์คํฌ๋ฅผ ์ ์ฅํ๊ณ , append๋ก ์ ํ์คํฌ๋ฅผ ์ถ๊ฐํ๋ฉฐ, ํํฐ๋ง์ ํตํด ๋ฏธ์๋ฃ ํ์คํฌ๋ง ์ ํํ๊ณ , ์ ๋ ฌ์ ํตํด ์ํ๋ฒณ ์์ผ๋ก ํ์คํฌ๋ฅผ ์ ๋ ฌํ์ด์. ์ด๋ ๊ฒ ์ฌ๋ผ์ด์ค์ ๋ค์ํ ๊ธฐ๋ฅ์ ํ์ฉํ๋ฉด ๋ณต์กํ ๋ฐ์ดํฐ ์ฒ๋ฆฌ๋ ์ฝ๊ฒ ํ ์ ์๋ต๋๋ค!
์ฌ๋ผ์ด์ค๋ ์ ๋ง ๊ฐ๋ ฅํ๊ณ ์ ์ฐํ ๋๊ตฌ์์. ์ด๋ฅผ ์ ํ์ฉํ๋ฉด Go ํ๋ก๊ทธ๋๋ฐ์์ ๋ฐ์ดํฐ๋ฅผ ํจ์จ์ ์ผ๋ก ๋ค๋ฃฐ ์ ์์ด์. ์ฌ๋ฅ๋ท์์ ๋ฐฐ์ด ๋ด์ฉ์ ๋ฐํ์ผ๋ก ๊ณ์ ์ฐ์ตํ๋ค ๋ณด๋ฉด, ์ด๋์ ์ฌ๋ฌ๋ถ๋ ์ฌ๋ผ์ด์ค์ ๋ฌ์ธ์ด ๋์ด ์์ ๊ฑฐ์์! ๐
๐ฑ Growth Mindset: ์ฌ๋ผ์ด์ค ์กฐ์์ ์ฒ์์๋ ๋ณต์กํด ๋ณด์ผ ์ ์์ง๋ง, ์ฐ์ต์ ํตํด ์ ์ ์ต์ํด์ง ๊ฑฐ์์. ์ด๋ ค์์ ๋๋ ๋๋ง๋ค "์์ง"์ด๋ผ๋ ๋จ์ด๋ฅผ ๋ถ์ฌ๋ณด์ธ์. "๋๋ ์์ง ์ฌ๋ผ์ด์ค๋ฅผ ์๋ฒฝํ๊ฒ ์ดํดํ์ง ๋ชปํ์ด"๋ผ๊ณ ์๊ฐํ๋ฉด, ๊ณ์ ์ฑ์ฅํ ์ ์๋ ๊ธฐํ๊ฐ ์ด๋ ค์๋ค๋ ๊ฑธ ๋๋ ์ ์์ ๊ฑฐ์์!
์, ์ด์ ์ฌ๋ผ์ด์ค์ ์ธ๊ณ๋ฅผ ๊น์ด ํํํด๋ดค์ด์. ์ด๋ ์ ๊ฐ์? ์กฐ๊ธ์ ๋ณต์กํ์ง๋ง ์ ๋ง ๊ฐ๋ ฅํ ๋๊ตฌ๋ผ๋ ๊ฑธ ๋๋ผ์ จ๋์? ๋ค์ ์น์ ์์๋ Go์ ๋ ๋ค๋ฅธ ์ค์ํ ๋ฐ์ดํฐ ๊ตฌ์กฐ์ธ ๋งต(Map)์ ๋ํด ์์๋ณผ ๊ฑฐ์์. ์ฌ๋ผ์ด์ค์ ๋งต์ ์์ ์์ฌ๋ก ๋ค๋ฃฐ ์ ์๋ค๋ฉด, ์ฌ๋ฌ๋ถ์ ์ด๋ฏธ Go ํ๋ก๊ทธ๋๋ฐ์ ์ ๋ฐ์ ๋ง์คํฐํ ๊ฑฐ๋ ๋ค๋ฆ์์ด์! ๊ณ์ํด์ Go์ ๋งค๋ ฅ์ ์ธ ์ธ๊ณ๋ฅผ ํํํด๋ณผ๊น์? Let's Go! ๐
๐บ๏ธ ๋งต (Map) ๊ธฐ์ด
์, ์ด์ Go ์ธ์ด์ ๋ ๋ค๋ฅธ ๊ฐ๋ ฅํ ๋ฌด๊ธฐ์ธ ๋งต(Map)์ ๋ํด ์์๋ณผ ์๊ฐ์ด์์! ๋งต์ ํค-๊ฐ ์์ ์ ์ฅํ๋ ํด์ ํ ์ด๋ธ ๊ธฐ๋ฐ์ ์๋ฃ๊ตฌ์กฐ์์. ํ์ด์ฌ์ ๋์ ๋๋ฆฌ, ์๋ฐ์คํฌ๋ฆฝํธ์ ๊ฐ์ฒด์ ๋น์ทํ๋ค๊ณ ์๊ฐํ๋ฉด ๋ผ์. ์ค๋น๋์ จ๋์? ๋งต์ ์ธ๊ณ๋ก ๋ ๋๋ณผ๊น์? ๐
1. ๋งต ์ ์ธํ๊ธฐ
๋งต์ ์ ์ธํ๋ ๋ฐฉ๋ฒ์ ์ฌ๋ฌ ๊ฐ์ง๊ฐ ์์ด์. ์ํฉ์ ๋ฐ๋ผ ๊ฐ์ฅ ์ ์ ํ ๋ฐฉ๋ฒ์ ์ ํํ๋ฉด ๋ผ์.
// ๋ฆฌํฐ๋ด๋ก ์ ์ธ
colors := map[string]string{
"red": "#ff0000",
"green": "#00ff00",
"blue": "#0000ff",
}
// make ํจ์ ์ฌ์ฉ
ages := make(map[string]int)
// nil ๋งต ์ ์ธ
var scores map[string]int
nil ๋งต๊ณผ ๋น ๋งต์ ๋ค๋ฅด๋ค๋ ์ ์ ๊ธฐ์ตํ์ธ์! nil ๋งต์๋ ํค-๊ฐ ์์ ์ถ๊ฐํ ์ ์์ง๋ง, ๋น ๋งต์๋ ์ถ๊ฐํ ์ ์์ด์.
๐ก Pro Tip: ๋งต์ ํฌ๊ธฐ๋ฅผ ๋๋ต์ ์ผ๋ก ์๊ณ ์๋ค๋ฉด, make ํจ์์ ์ด๊ธฐ ํฌ๊ธฐ๋ฅผ ์ง์ ํด์ฃผ๋ ๊ฒ์ด ์ข์์. ์ด๋ ๊ฒ ํ๋ฉด ๋งต์ด ์๋์ผ๋ก ํฌ๊ธฐ๋ฅผ ์กฐ์ ํ๋ ํ์๋ฅผ ์ค์ผ ์ ์์ด ์ฑ๋ฅ์ด ํฅ์๋ผ์!
2. ๋งต์ ์์ ์ถ๊ฐํ๊ธฐ
๋งต์ ์๋ก์ด ํค-๊ฐ ์์ ์ถ๊ฐํ๋ ๊ฒ์ ๋งค์ฐ ๊ฐ๋จํด์.
ages := make(map[string]int)
// ์์ ์ถ๊ฐ
ages["Alice"] = 30
ages["Bob"] = 25
fmt.Println(ages) // map[Alice:30 Bob:25]
3. ๋งต์์ ๊ฐ ๊ฐ์ ธ์ค๊ธฐ
๋งต์์ ๊ฐ์ ๊ฐ์ ธ์ฌ ๋๋ ํค๋ฅผ ์ฌ์ฉํด์. ์ด๋ ์ฃผ์ํ ์ ์ด ์์ด์!
age, exists := ages["Alice"]
if exists {
fmt.Printf("Alice์ ๋์ด๋ %d์ด์
๋๋ค.\n", age)
} else {
fmt.Println("Alice์ ์ ๋ณด๊ฐ ์์ต๋๋ค.")
}
๋งต์์ ๊ฐ์ ๊ฐ์ ธ์ฌ ๋๋ ํญ์ ๋ ๋ฒ์งธ ๋ฐํ๊ฐ์ ์ฒดํฌํ๋ ๊ฒ์ด ์ข์์. ์ด ๊ฐ์ ํด๋น ํค๊ฐ ๋งต์ ์กด์ฌํ๋์ง ์ฌ๋ถ๋ฅผ ์๋ ค์ค์.
4. ๋งต์์ ์์ ์ญ์ ํ๊ธฐ
๋งต์์ ์์๋ฅผ ์ญ์ ํ ๋๋ delete
ํจ์๋ฅผ ์ฌ์ฉํด์.
delete(ages, "Bob")
fmt.Println(ages) // map[Alice:30]
delete ํจ์๋ ํด๋น ํค๊ฐ ๋งต์ ์์ด๋ ์์ ํ๊ฒ ๋์ํด์. ์๋ฌ๊ฐ ๋ฐ์ํ์ง ์์ฃ .
5. ๋งต ์ํํ๊ธฐ
๋งต์ ๋ชจ๋ ์์๋ฅผ ์ํํ ๋๋ range
ํค์๋๋ฅผ ์ฌ์ฉํด์.
for name, age := range ages {
fmt.Printf("%s์ ๋์ด๋ %d์ด์
๋๋ค.\n", name, age)
}
๐ Fun Fact: Go์ ๋งต์ ์์๋ฅผ ๋ณด์ฅํ์ง ์์์. ๋งค๋ฒ ์ํํ ๋๋ง๋ค ์์์ ์์๊ฐ ๋ค๋ฅผ ์ ์์ด์. ์ด๊ฑด ๋งต์ ๋ด๋ถ ๊ตฌํ ๋๋ฌธ์ด์์. ์์๊ฐ ์ค์ํ๋ค๋ฉด ๋ณ๋์ ์ ๋ ฌ ๋ก์ง์ ๊ตฌํํด์ผ ํด์!
6. ๋งต์ ๊ธธ์ด ํ์ธํ๊ธฐ
๋งต์ ์ ์ฅ๋ ํค-๊ฐ ์์ ๊ฐ์๋ฅผ ์๊ณ ์ถ๋ค๋ฉด len
ํจ์๋ฅผ ์ฌ์ฉํ๋ฉด ๋ผ์.
fmt.Printf("๋งต์ ํฌ๊ธฐ: %d\n", len(ages))
7. ์ค์ฒฉ๋ ๋งต
๋งต์ ๊ฐ์ผ๋ก ๋ค๋ฅธ ๋งต์ ์ฌ์ฉํ ์๋ ์์ด์. ์ด๋ฅผ ์ค์ฒฉ๋ ๋งต์ด๋ผ๊ณ ํด์.
users := map[string]map[string]string{
"Alice": {
"email": "alice@example.com",
"phone": "123-456-7890",
},
"Bob": {
"email": "bob@example.com",
"phone": "098-765-4321",
},
}
fmt.Println(users["Alice"]["email"]) // alice@example.com
์ค์ ์์ : ๋งต์ ํ์ฉํ ๊ฐ๋จํ ์ฃผ์๋ก
์ด์ ์ฐ๋ฆฌ๊ฐ ๋ฐฐ์ด ๋ด์ฉ์ ํ์ฉํด์ ๊ฐ๋จํ ์ฃผ์๋ก์ ๋ง๋ค์ด๋ณผ๊น์?
package main
import (
"fmt"
"sort"
)
type Contact struct {
Email string
Phone string
}
func main() {
addressBook := make(map[string]Contact)
// ์ฐ๋ฝ์ฒ ์ถ๊ฐ
addressBook["Alice"] = Contact{"alice@example.com", "123-456-7890"}
addressBook["Bob"] = Contact{"bob@example.com", "098-765-4321"}
addressBook["Charlie"] = Contact{"charlie@example.com", "111-222-3333"}
// ์ฐ๋ฝ์ฒ ๊ฒ์
name := "Bob"
if contact, exists := addressBook[name]; exists {
fmt.Printf("%s์ ์ฐ๋ฝ์ฒ:\n", name)
fmt.Printf(" ์ด๋ฉ์ผ: %s\n", contact.Email)
fmt.Printf(" ์ ํ๋ฒํธ: %s\n", contact.Phone)
} else {
fmt.Printf("%s์ ์ฐ๋ฝ์ฒ๋ฅผ ์ฐพ์ ์ ์์ต๋๋ค.\n", name)
}
// ์ฐ๋ฝ์ฒ ์ญ์
delete(addressBook, "Charlie")
// ๋ชจ๋ ์ฐ๋ฝ์ฒ ์ถ๋ ฅ (์ด๋ฆ ์์ผ๋ก ์ ๋ ฌ)
names := make([]string, 0, len(addressBook))
for name := range addressBook {
names = append(names, name)
}
sort.Strings(names)
fmt.Println("\n์ฃผ์๋ก:")
for _, name := range names {
contact := addressBook[name]
fmt.Printf("%s: %s, %s\n", name, contact.Email, contact.Phone)
}
}
์ด ์์ ์์๋ ๋งต์ ์ฌ์ฉํด ์ด๋ฆ์ ํค๋ก, Contact ๊ตฌ์กฐ์ฒด๋ฅผ ๊ฐ์ผ๋ก ํ๋ ์ฃผ์๋ก์ ๋ง๋ค์์ด์. ์ฐ๋ฝ์ฒ๋ฅผ ์ถ๊ฐํ๊ณ , ๊ฒ์ํ๊ณ , ์ญ์ ํ๋ ๊ธฐ๋ฅ์ ๊ตฌํํ์ฃ . ๋ํ ๋งต์ ํค๋ฅผ ์ ๋ ฌํด์ ์ํ๋ฒณ ์์ผ๋ก ์ฐ๋ฝ์ฒ๋ฅผ ์ถ๋ ฅํ๋ ๋ฐฉ๋ฒ๋ ๋ณด์ฌ์คฌ์ด์.
๋งต์ ์ ๋ง ์ ์ฉํ ์๋ฃ๊ตฌ์กฐ์์. ํค๋ฅผ ํตํด ๋น ๋ฅด๊ฒ ๊ฐ์ ์ฐพ์ ์ ์๊ณ , ๋ฐ์ดํฐ๋ฅผ ๊ตฌ์กฐํํ๋ ๋ฐ ์์ฃผ ํจ๊ณผ์ ์ด์ฃ . ์ฌ๋ฅ๋ท์์ ๋ฐฐ์ด ๋ด์ฉ์ ๋ฐํ์ผ๋ก ๊ณ์ ์ฐ์ตํ๋ค ๋ณด๋ฉด, ์ด๋์ ์ฌ๋ฌ๋ถ๋ ๋งต์ ๋ฌ์ธ์ด ๋์ด ์์ ๊ฑฐ์์! ๐
๐ฑ Growth Mindset: ๋งต์ ์ฒ์ ์ ํ๋ฉด ๋ณต์กํด ๋ณด์ผ ์ ์์ง๋ง, ์ฌ์ฉํ๋ค ๋ณด๋ฉด ๊ทธ ์ ์ฉ์ฑ์ ๊นจ๋ซ๊ฒ ๋ ๊ฑฐ์์. ์ด๋ ค์์ ๋๋ ๋๋ง๋ค "์ด๊ฑด ์์ง ์ต์ํ์ง ์์ ๋ฟ์ด์ผ"๋ผ๊ณ ์๊ฐํด๋ณด์ธ์. ๊ณ์ ์ฐ์ตํ๊ณ ์คํํด๋ณด๋ฉด, ๋งต์ ์์ ์์ฌ๋ก ๋ค๋ฃฐ ์ ์๊ฒ ๋ ๊ฑฐ์์!
์, ์ด์ ๋งต์ ๊ธฐ๋ณธ์ ์์๋ดค์ด์. ์ด๋ ์ ๊ฐ์? ๋งต์ด ์ผ๋ง๋ ๊ฐ๋ ฅํ๊ณ ์ ์ฉํ ๋๊ตฌ์ธ์ง ๋๋ผ์ จ๋์? ๋ค์ ์น์ ์์๋ ๋งต์ ๋ด๋ถ ๊ตฌ์กฐ์ ๋ํด ๋ ์์ธํ ์์๋ณผ ๊ฑฐ์์. ๋งต์ด ์ด๋ป๊ฒ ๋์ํ๋์ง ์ดํดํ๋ฉด, ๋ ํจ์จ์ ์ผ๋ก ์ฌ์ฉํ ์ ์์ ๊ฑฐ์์. ๊ณ์ํด์ Go์ ๋งค๋ ฅ์ ์ธ ์ธ๊ณ๋ฅผ ํํํด๋ณผ๊น์? Let's Go! ๐
๐ฌ ๋งต์ ๋ด๋ถ ๊ตฌ์กฐ
์, ์ด์ ๋งต์ ๋ด๋ถ๋ก ๋ค์ด๊ฐ๋ณผ ์๊ฐ์ด์์! ๋งต์ด ์ด๋ป๊ฒ ๋์ํ๋์ง ์ดํดํ๋ฉด, ๋ ํจ์จ์ ์ผ๋ก ์ฌ์ฉํ ์ ์์ ๊ฑฐ์์. ์ค๋น๋์ จ๋์? ๋งต์ ๋น๋ฐ์ ํํค์ณ๋ณผ๊น์? ๐ต๏ธโโ๏ธ
1. ํด์ ํ ์ด๋ธ
Go์ ๋งต์ ๋ด๋ถ์ ์ผ๋ก ํด์ ํ ์ด๋ธ๋ก ๊ตฌํ๋์ด ์์ด์. ํด์ ํ ์ด๋ธ์ ํค๋ฅผ ํน์ ๊ฐ(ํด์)์ผ๋ก ๋ณํํ ํ, ๊ทธ ๊ฐ์ ์ธ๋ฑ์ค๋ก ์ฌ์ฉํด ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ์๋ฃ๊ตฌ์กฐ์์.
ํด์ ํจ์๋ ํค๋ฅผ ๊ณ ์ ํ ์ซ์๋ก ๋ณํํด์. ์ด ์ซ์๋ฅผ ์ฌ์ฉํด ๊ฐ์ ์ ์ฅํ๊ฑฐ๋ ๊ฒ์ํ๋ ๊ฑฐ์ฃ . ์ด ๋ฐฉ์ ๋๋ถ์ ๋งต์ ๋งค์ฐ ๋น ๋ฅธ ๊ฒ์ ์๋๋ฅผ ์๋ํด์!
2. ์ถฉ๋ ํด๊ฒฐ
๋๋ก๋ ์๋ก ๋ค๋ฅธ ํค๊ฐ ๊ฐ์ ํด์ ๊ฐ์ ๊ฐ์ง ์ ์์ด์. ์ด๋ฅผ '์ถฉ๋'์ด๋ผ๊ณ ํด์. Go์ ๋งต์ ์ด๋ฐ ์ถฉ๋์ ํด๊ฒฐํ๊ธฐ ์ํด '์ฒด์ด๋' ๋ฐฉ์์ ์ฌ์ฉํด์.
// ๋ด๋ถ์ ์ผ๋ก ์ด๋ฐ ์์ผ๋ก ๊ตฌํ๋์ด ์์ด์ (์ค์ ์ฝ๋๋ ์๋์์!)
type hmap struct {
count int
flags uint8
B uint8
noverflow uint16
hash0 uint32
buckets unsafe.Pointer
// ... ๊ธฐํ ํ๋๋ค
}
type bmap struct {
tophash [8]uint8
// ๋ค์์ ํค๋ค๊ณผ ๊ฐ๋ค์ด ์์นํด ์์ด์ (Go ์ปดํ์ผ๋ฌ๊ฐ ์์ฑ)
// ๊ทธ ๋ค์์ overflow ํฌ์ธํฐ๊ฐ ์์ด์
}
๊ฐ ๋ฒํท์ ์ต๋ 8๊ฐ์ ํค-๊ฐ ์์ ์ ์ฅํ ์ ์์ด์. ๋ง์ฝ ๋ ๋ง์ ํค-๊ฐ ์์ด ๊ฐ์ ๋ฒํท์ ํ ๋น๋๋ฉด, ์ค๋ฒํ๋ก ๋ฒํท์ด ์์ฑ๋ผ์.
๐ก Pro Tip: ๋งต์ ์ฑ๋ฅ์ ์ต์ ํํ๋ ค๋ฉด, ๊ฐ๋ฅํ ํ ์ถฉ๋์ ์ค์ด๋ ๊ฒ์ด ์ข์์. ํค์ ๋ถํฌ๊ฐ ๊ณ ๋ฅด์ง ์์ผ๋ฉด ์ฑ๋ฅ์ด ์ ํ๋ ์ ์์ด์. ํค ์ค๊ณ ์ ์ด ์ ์ ๊ณ ๋ คํด๋ณด์ธ์!
3. ๋งต์ ์ฑ์ฅ
๋งต์ ์์๊ฐ ์ถ๊ฐ๋๋ฉด์ ํฌ๊ธฐ๊ฐ ์ปค์ง๋ฉด, Go ๋ฐํ์์ ์๋์ผ๋ก ๋งต์ ์ฌํ ๋นํด์. ์ด ๊ณผ์ ์ ๋ค์๊ณผ ๊ฐ์์:
- ์๋ก์ด, ๋ ํฐ ํด์ ํ ์ด๋ธ์ ์์ฑํด์.
- ๋ชจ๋ ๊ธฐ์กด ํค-๊ฐ ์์ ์ ํ ์ด๋ธ๋ก ๋ณต์ฌํด์.
- ๊ธฐ์กด ํ ์ด๋ธ์ ์ญ์ ํ๊ณ ์ ํ ์ด๋ธ์ ์ฌ์ฉํด์.
์ด ๊ณผ์ ์ ์๋์ผ๋ก ์ผ์ด๋์ง๋ง, ๋๋์ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃฐ ๋๋ ์ฑ๋ฅ์ ์ํฅ์ ์ค ์ ์์ด์. ๊ทธ๋์ ๊ฐ๋ฅํ๋ค๋ฉด ์ด๊ธฐ ํฌ๊ธฐ๋ฅผ ์ ์ ํ ์ค์ ํ๋ ๊ฒ์ด ์ข์์.
4. ๋งต์ ์ํ
๋งต์ ์ํํ ๋, Go๋ ๋๋คํ ์์๋ก ์์๋ค์ ๋ฐํํด์. ์ด๋ ์๋์ ์ธ ์ค๊ณ์์.
for key, value := range myMap {
// ์ด ์์๋ ๋งค๋ฒ ๋ค๋ฅผ ์ ์์ด์!
fmt.Printf("%v: %v\n", key, value)
}
์ด๋ ๊ฒ ํจ์ผ๋ก์จ, ํ ๋ก๊ทธ๋๋จธ๊ฐ ๋งต์ ์์์ ์์กดํ์ง ์๋๋ก ์ ๋ํ๊ณ , ํด์ ํจ์์ ๋ณ๊ฒฝ์ด๋ ๋งต์ ๋ด๋ถ ๊ตฌํ ๋ณ๊ฒฝ์ ์ํฅ์ ๋ฐ์ง ์๊ฒ ํด์.
5. ๋์์ฑ๊ณผ ๋งต
Go์ ๊ธฐ๋ณธ ๋งต์ ๋์์ฑ์ ์์ ํ์ง ์์์. ์ฌ๋ฌ ๊ณ ๋ฃจํด์์ ๋์์ ๋งต์ ์์ ํ๋ฉด ์์ธกํ ์ ์๋ ๊ฒฐ๊ณผ๊ฐ ๋ฐ์ํ ์ ์์ด์.
// ์ด๋ ๊ฒ ํ๋ฉด ์ํํด์!
go func() {
myMap["key"] = "value1"
}()
go func() {
myMap["key"] = "value2"
}()
๋์์ฑ ํ๊ฒฝ์์ ๋งต์ ์์ ํ๊ฒ ์ฌ์ฉํ๋ ค๋ฉด sync.Map
์ ์ฌ์ฉํ๊ฑฐ๋, ๋ฎคํ
์ค๋ฅผ ์ด์ฉํด ์ ๊ทผ์ ๋๊ธฐํํด์ผ ํด์.
var mu sync.Mutex
myMap := make(map[string]string)
go func() {
mu.Lock()
myMap["key"] = "value1"
mu.Unlock()
}()
๐ Fun Fact: Go 1.9๋ถํฐ ๋์
๋ sync.Map
์ ๋์์ฑ ํ๊ฒฝ์ ์ต์ ํ๋์ด ์์ด์. ์ฝ๊ธฐ ์์
์ด ๋ง๊ณ ์ฐ๊ธฐ ์์
์ด ์ ์ ๊ฒฝ์ฐ์ ํนํ ์ ์ฉํ๋ต๋๋ค!
6. ๋งต์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ
๋งต์ ๋์ ์ผ๋ก ํฌ๊ธฐ๊ฐ ์กฐ์ ๋๊ธฐ ๋๋ฌธ์, ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ด ์ ๋์ ์ด์์. ํฐ ๋งต์ ์ฌ์ฉํ ๋๋ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ์ฃผ์ํด์ผ ํด์.
// ํฐ ๋งต ์์ฑ
bigMap := make(map[int]string, 1000000)
// ๋งต ๋น์ฐ๊ธฐ
for k := range bigMap {
delete(bigMap, k)
}
// ๋ฉ๋ชจ๋ฆฌ๋ฅผ Go ๋ฐํ์์ ๋ฐํ
bigMap = nil
๋งต์ ๋น์ฐ๋๋ผ๋ ๋ด๋ถ ๋ฒํท ๊ตฌ์กฐ๋ ๊ทธ๋๋ก ์ ์ง๋ผ์. ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์์ ํ ํด์ ํ๋ ค๋ฉด ๋งต์ nil๋ก ์ค์ ํด์ผ ํด์.
์ค์ ์์ : ๋งต์ ๋ด๋ถ ๊ตฌ์กฐ๋ฅผ ๊ณ ๋ คํ ์ฑ๋ฅ ์ต์ ํ
์ด์ ์ฐ๋ฆฌ๊ฐ ๋ฐฐ์ด ๋ด์ฉ์ ํ์ฉํด์ ๋งต์ ์ฑ๋ฅ์ ์ต์ ํํ๋ ์์ ๋ฅผ ๋ง๋ค์ด๋ณผ๊น์?
package main
import (
"fmt"
"runtime"
"time"
)
func main() {
// ์ด๊ธฐ ํฌ๊ธฐ๋ฅผ ์ง์ ํ์ฌ ๋งต ์์ฑ
const mapSize = 1000000
m := make(map[int]int, mapSize)
// ๋งต์ ๋ฐ์ดํฐ ์ถ๊ฐ
start := time.Now()
for i := 0; i < mapSize; i++ {
m[i] = i
}
fmt.Printf("๋งต ์ฑ์ฐ๊ธฐ ์์ ์๊ฐ: %v\n", time.Since(start))
// ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋ ํ์ธ
var m1 runtime.MemStats
runtime.ReadMemStats(&m1)
fmt.Printf("๋งต ์์ฑ ํ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋: %v MB\n", m1.Alloc/1024/1024)
// ๋งต ๋น์ฐ๊ธฐ
start = time.Now()
for k := range m {
delete(m, k)
}
fmt.Printf("๋งต ๋น์ฐ๊ธฐ ์์ ์๊ฐ: %v\n", time.Since(start))
// ๋ฉ๋ชจ๋ฆฌ ํด์
m = nil
runtime.GC()
// ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋ ๋ค์ ํ์ธ
var m2 runtime.MemStats
runtime.ReadMemStats(&m2)
fmt.Printf("๋งต ์ญ์ ํ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋: %v MB\n", m2.Alloc/1024/1024)
}
์ด ์์ ์์๋ ๋งต์ ์ด๊ธฐ ํฌ๊ธฐ๋ฅผ ์ง์ ํ์ฌ ์์ฑํ๊ณ , ๋๋์ ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐํ ํ ์ญ์ ํ๋ ๊ณผ์ ์ ๋ณด์ฌ์ค์. ๋ํ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ํ์ธํ์ฌ ๋งต์ ์์ฑ๊ณผ ์ญ์ ๊ฐ ๋ฉ๋ชจ๋ฆฌ์ ๋ฏธ์น๋ ์ํฅ์ ๋ณผ ์ ์์ด์.
๋งต์ ๋ด๋ถ ๊ตฌ์กฐ๋ฅผ ์ดํดํ๋ฉด ์ด๋ ๊ฒ ์ฑ๋ฅ๊ณผ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ์ ์ต์ ํํ ์ ์์ด์. ์ฌ๋ฅ๋ท์์ ๋ฐฐ์ด Go ํ๋ก๊ทธ๋๋ฐ ์คํฌ์ ํ์ฉํ๋ฉด, ๋์ฑ ํจ์จ์ ์ธ ํ๋ก๊ทธ๋จ์ ๋ง๋ค ์ ์์ ๊ฑฐ์์! ๐
๐ฑ Growth Mindset: ๋งต์ ๋ด๋ถ ๊ตฌ์กฐ๋ฅผ ์ดํดํ๋ ๊ฒ์ ์ฒ์์๋ ์ด๋ ค์ธ ์ ์์ด์. ํ์ง๋ง ์ด๋ฐ ๊น์ด ์๋ ์ดํด๋ ์ฌ๋ฌ๋ถ์ ๋ ๋์ ํ๋ก๊ทธ๋๋จธ๋ก ๋ง๋ค์ด์ค ๊ฑฐ์์. "๋๋ ์์ง ๋งต์ ๋ชจ๋ ๊ฒ์ ์ดํดํ์ง ๋ชปํ์ด"๋ผ๊ณ ์๊ฐํ๋ ๋์ , "๋๋ ๋งต์ ๋ํด ๊ณ์ ๋ฐฐ์ฐ๊ณ ์์ด"๋ผ๊ณ ์๊ฐํด๋ณด์ธ์. ๋์์๋ ํ์ต๊ณผ ์คํ์ ํตํด ์ฌ๋ฌ๋ถ์ Go์ ์ ๋ฌธ๊ฐ๊ฐ ๋ ์ ์์ด์!
์, ์ด์ ๋งต์ ๋ด๋ถ ๊ตฌ์กฐ๊น์ง ๊น์ด ๋ค์ฌ๋ค๋ดค์ด์. ์ด๋ ์ ๊ฐ์? ๋งต์ด ์ผ๋ง๋ ๋ณต์กํ๊ณ ์ ๊ตํ ๋ฉ์ปค๋์ฆ์ผ๋ก ๋์ํ๋์ง ๋๋ผ์ จ๋์? ์ด๋ฐ ์ง์์ ๋ฐํ์ผ๋ก ๋งต์ ๋์ฑ ํจ์จ์ ์ผ๋ก ์ฌ์ฉํ ์ ์์ ๊ฑฐ์์. ๋ค์ ์น์ ์์๋ ๋งต์ ์ค์ ๋ก ํ์ฉํ๋ ๋ค์ํ ๋ฐฉ๋ฒ๋ค์ ์์๋ณผ ๊ฑฐ์์. Go์ ๋งต ๋ง์คํฐ๊ฐ ๋๋ ์ฌ์ , ๊ณ์ ์ด์ด๊ฐ๋ณผ๊น์? Let's Go! ๐
๐ ๏ธ ๋งต ํ์ฉํ๊ธฐ
์, ์ด์ ๋งต์ ๊ธฐ๋ณธ ๊ฐ๋ ๊ณผ ๋ด๋ถ ๊ตฌ์กฐ๋ฅผ ์์์ผ๋, ์ค์ ๋ก ์ด๋ป๊ฒ ํ์ฉํ๋์ง ์์๋ณผ ์ฐจ๋ก์์! ๋งต์ ์ ๋ง ๋ค์ฌ๋ค๋ฅํ ๋๊ตฌ์์. ๋ค์ํ ์ํฉ์์ ์ ์ฉํ๊ฒ ์ฌ์ฉํ ์ ์์ฃ . ์ค๋น๋์ จ๋์? ๋งต์ ์ค์ ํ์ฉ๋ฒ์ ๋ฐฐ์๋ณผ๊น์? ๐
1. ๋น๋์ ๊ณ์ฐํ๊ธฐ
๋งต์ ์์์ ๋น๋์๋ฅผ ๊ณ์ฐํ ๋ ์์ฃผ ์ ์ฉํด์. ์๋ฅผ ๋ค์ด, ๋ฌธ์์ด์์ ๊ฐ ๋ฌธ์์ ๋ฑ์ฅ ํ์๋ฅผ ์ธ๋ ํ๋ก๊ทธ๋จ์ ๋ง๋ค์ด๋ณผ๊น์?
func countCharacters(s string) map[rune]int {
freq := make(map[rune]int)
for _, char := range s {
freq[char]++
}
return freq
}
func main() {
text := "hello, world!"
charFreq := countCharacters(text)
for char, count := range charFreq {
fmt.Printf("'%c': %d\n", char, count)
}
}
์ด ์์ ์์ ๋งต์ ํค๋ ๋ฌธ์(rune)์ด๊ณ , ๊ฐ์ ๊ทธ ๋ฌธ์์ ๋ฑ์ฅ ํ์์์. ๋งต์ ์ ๋ก๊ฐ ํน์ฑ์ ํ์ฉํด ์ฝ๋๋ฅผ ๊ฐ๊ฒฐํ๊ฒ ๋ง๋ค ์ ์์ฃ .
2. ์บ์๋ก ์ฌ์ฉํ๊ธฐ
๋งต์ ๊ฐ๋จํ ์บ์ ๊ตฌํ์๋ ํ์ฉํ ์ ์์ด์. ์๋ฅผ ๋ค์ด, ํผ๋ณด๋์น ์์ด์ ๊ณ์ฐํ ๋ ์ด์ ์ ๊ณ์ฐํ ๊ฐ์ ์ ์ฅํด๋๋ฉด ์ฑ๋ฅ์ ํฌ๊ฒ ํฅ์์ํฌ ์ ์์ด์.
var fibCache = make(map[int]int)
func fibonacci(n int) int {
if n <= 1 {
return n
}
if val, exists := fibCache[n]; exists {
return val
}
result := fibonacci(n-1) + fibonacci(n-2)
fibCache[n] = result
return result
}
func main() {
fmt.Println(fibonacci(100)) // ๋งค์ฐ ๋น ๋ฅด๊ฒ ๊ณ์ฐ๋ฉ๋๋ค!
}
์ด ๋ฐฉ์์ ๋ฉ๋ชจ์ด์ ์ด์ (memoization)์ด๋ผ๊ณ ํด์. ๋งต์ ์บ์๋ก ์ฌ์ฉํด ์ด๋ฏธ ๊ณ์ฐํ ๊ฐ์ ์ ์ฅํ๊ณ ์ฌ์ฌ์ฉํจ์ผ๋ก์จ ๊ณ์ฐ ์๊ฐ์ ํฌ๊ฒ ๋จ์ถ์ํฌ ์ ์์ด์.
3. ๊ทธ๋ํ ํํํ๊ธฐ
๋งต์ ๊ทธ๋ํ๋ฅผ ํํํ๋ ๋ฐ์๋ ์ฌ์ฉํ ์ ์์ด์. ๊ฐ ๋ ธ๋๋ฅผ ํค๋ก, ๊ทธ ๋ ธ๋์ ์ฐ๊ฒฐ๋ ๋ ธ๋๋ค์ ๋ฆฌ์คํธ๋ฅผ ๊ฐ์ผ๋ก ์ฌ์ฉํ๋ฉด ๋ผ์.
type Graph map[string][]string
func (g Graph) AddEdge(from, to string) {
g[from] = append(g[from], to)
}
func (g Graph) Print() {
for node, neighbors := range g {
fmt.Printf("%s -> %v\n", node, neighbors)
}
}
func main() {
graph := make(Graph)
graph.AddEdge("A", "B")
graph.AddEdge("A", "C")
graph.AddEdge("B", "D")
graph.AddEdge("C", "D")
graph.Print()
}
์ด ์์ ์์ ๋งต์ ๊ทธ๋ํ์ ์ธ์ ๋ฆฌ์คํธ ํํ์ ๊ตฌํํ๋ ๋ฐ ์ฌ์ฉ๋์ด์. ๊ฐ ๋ ธ๋์ ๊ทธ ์ด์๋ค์ ํจ์จ์ ์ผ๋ก ์ ์ฅํ๊ณ ์ ๊ทผํ ์ ์์ฃ .
4. ์งํฉ(Set) ๊ตฌํํ๊ธฐ
Go์๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์งํฉ(Set) ์๋ฃ๊ตฌ์กฐ๊ฐ ์์ง๋ง, ๋งต์ ์ฌ์ฉํด ์ฝ๊ฒ ๊ตฌํํ ์ ์์ด์.
type Set map[string]bool
func (s Set) Add(item string) {
s[item] = true
}
func (s Set) Remove(item string) {
delete(s, item)
}
func (s Set) Contains(item string) bool {
_, exists := s[item]
return exists
}
func main() {
fruits := make(Set)
fruits.Add("apple")
fruits.Add("banana")
fruits.Add("orange")
fmt.Println(fruits.Contains("apple")) // true
fmt.Println(fruits.Contains("grape")) // false
fruits.Remove("banana")
fmt.Println(fruits.Contains("banana")) // false
}
๋งต์ ํค๋ฅผ ์งํฉ์ ์์๋ก ์ฌ์ฉํ๊ณ , ๊ฐ์ ๋จ์ํ true๋ก ์ค์ ํด์. ์ด๋ ๊ฒ ํ๋ฉด ์ค๋ณต์ ์๋์ผ๋ก ์ ๊ฑฐํ๊ณ , ์์์ ์กด์ฌ ์ฌ๋ถ๋ฅผ ๋น ๋ฅด๊ฒ ํ์ธํ ์ ์์ด์.
5. JSON ํ์ฑํ๊ธฐ
๋งต์ JSON ๋ฐ์ดํฐ๋ฅผ ํ์ฑํ ๋๋ ์ ์ฉํด์. ํนํ ๊ตฌ์กฐ๊ฐ ๋์ ์ธ JSON ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃฐ ๋ ๊ฐ๋ ฅํ ๋๊ตฌ๊ฐ ๋ ์ ์์ด์.
import (
"encoding/json"
"fmt"
)
func main() {
jsonStr := `{"name": "John", "age": 30, "city": "New York"}`
var data map[string]interface{}
err := json.Unmarshal([]byte(jsonStr), &data)
if err != nil {
fmt.Println("Error:", err)
return
}
for key, value := range data {
fmt.Printf("%s: %v\n", key, value)
}
}
์ด ์์ ์์ ๋งต์ ํค๊ฐ ๋ฌธ์์ด์ด๊ณ ๊ฐ์ด interface{} ํ์ ์ธ ํํ๋ก ์ฌ์ฉ๋ผ์. ์ด๋ ๊ฒ ํ๋ฉด ์ด๋ค ํํ์ JSON ๋ฐ์ดํฐ๋ ํ์ฑํ ์ ์์ด์.
๐ก Pro Tip: ๋งต๊ณผ ์ธํฐํ์ด์ค๋ฅผ ์กฐํฉํด ์ฌ์ฉํ๋ฉด ๋งค์ฐ ์ ์ฐํ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ๋ง๋ค ์ ์์ด์. ํ์ง๋ง ํ์ ์์ ์ฑ์ด ๋จ์ด์ง ์ ์์ผ๋ ์ฃผ์๊ฐ ํ์ํด์. ๊ฐ๋ฅํ๋ค๋ฉด ๊ตฌ์ฒด์ ์ธ ๊ตฌ์กฐ์ฒด๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์์!
์ค์ ์์ : ๋จ์ด ๋น๋์ ๋ถ์๊ธฐ
์ด์ ์ฐ๋ฆฌ๊ฐ ๋ฐฐ์ด ๋ด์ฉ์ ํ์ฉํด์ ์กฐ๊ธ ๋ ๋ณต์กํ ์์ ๋ฅผ ๋ง๋ค์ด๋ณผ๊น์? ํ ์คํธ ํ์ผ์์ ๋จ์ด์ ๋น๋์๋ฅผ ๋ถ์ํ๋ ํ๋ก๊ทธ๋จ์ ๋ง๋ค์ด๋ด์.
package main
import (
"bufio"
"fmt"
"os"
"sort"
"strings"
)
func main() {
filename := "sample.txt"
wordFreq := make(map[string]int)
// ํ์ผ ์ฝ๊ธฐ
file, err := os.Open(filename)
if err != nil {
fmt.Println("Error:", err)
return
}
defer file.Close()
scanner := bufio.NewScanner(file)
scanner.Split(bufio.ScanWords)
// ๋จ์ด ๋น๋์ ๊ณ์ฐ
for scanner.Scan() {
word := strings.ToLower(scanner.Text())
wordFreq[word]++
}
// ๋น๋์ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌ
type wordCount struct {
word string
count int
}
var wc []wordCount
for word, count := range wordFreq {
wc = append(wc, wordCount{word, count})
}
sort.Slice(wc, func(i, j int) bool {
return wc[i].count > wc[j].count
})
// ์์ 10๊ฐ ๋จ์ด ์ถ๋ ฅ
fmt.Println("๊ฐ์ฅ ๋ง์ด ์ฌ์ฉ๋ ๋จ์ด:")
for i := 0; i < 10 && i < len(wc); i++ {
fmt.Printf("%d. %s (%d๋ฒ)\n", i+1, wc[i].word, wc[i].count)
}
}
์ด ํ๋ก๊ทธ๋จ์ ๋ค์๊ณผ ๊ฐ์ ์์ ์ ์ํํด์:
- ํ ์คํธ ํ์ผ์ ์ฝ์ด๋ค์ ๋๋ค.
- ๊ฐ ๋จ์ด์ ๋น๋์๋ฅผ ๋งต์ ์ ์ฅํฉ๋๋ค.
- ๋น๋์๋ฅผ ๊ธฐ์ค์ผ๋ก ๋จ์ด๋ค์ ์ ๋ ฌํฉ๋๋ค.
- ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉ๋ ์์ 10๊ฐ ๋จ์ด๋ฅผ ์ถ๋ ฅํฉ๋๋ค.
์ด๋ฐ ์์ผ๋ก ๋งต์ ํ์ฉํ๋ฉด ๋ณต์กํ ๋ฐ์ดํฐ ๋ถ์ ์์ ๋ ํจ์จ์ ์ผ๋ก ์ํํ ์ ์์ด์. ์ฌ๋ฅ๋ท์์ ๋ฐฐ์ด Go ํ๋ก๊ทธ๋๋ฐ ์คํฌ์ ํ์ฉํ๋ฉด, ๋์ฑ ๊ฐ๋ ฅํ๊ณ ์ ์ฉํ ํ๋ก๊ทธ๋จ์ ๋ง๋ค ์ ์์ ๊ฑฐ์์! ๐
๐ Fun Fact: ์ด๋ฐ ์ข ๋ฅ์ ๋จ์ด ๋น๋์ ๋ถ์์ ์์ฐ์ด ์ฒ๋ฆฌ(NLP)์ ๊ธฐ์ด๊ฐ ๋ผ์. ๊ฒ์ ์์ง, ์คํธ ํํฐ, ์ถ์ฒ ์์คํ ๋ฑ ๋ค์ํ ๋ถ์ผ์์ ํ์ฉ๋๊ณ ์๋ต๋๋ค. ์ฌ๋ฌ๋ถ๋ ์ด์ ๋น ๋ฐ์ดํฐ ๋ถ์์ ์ฒซ๊ฑธ์์ ๋์ด์!
์, ์ด์ ๋งต์ ๋ค์ํ ํ์ฉ๋ฒ์ ์์๋ดค์ด์. ์ด๋ ์ ๊ฐ์? ๋งต์ด ์ผ๋ง๋ ์ ์ฉํ๊ณ ๊ฐ๋ ฅํ ๋๊ตฌ์ธ์ง ๋๋ผ์ จ๋์? ๋จ์ํ ํค-๊ฐ ์ ์ฅ์๋ฅผ ๋์ด์ ๋ณต์กํ ์๊ณ ๋ฆฌ์ฆ๊ณผ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ๊ตฌํํ๋ ๋ฐ์๋ ์ฌ์ฉํ ์ ์๋ค๋ ๊ฑธ ๋ณด์ จ์ฃ . ์ด์ ์ฌ๋ฌ๋ถ์ Go์ ๋งต์ ์์ ์์ฌ๋ก ๋ค๋ฃฐ ์ ์๋ ์ค๋ ฅ์ ๊ฐ์ถ๊ฒ ๋์ด์! ๐
๋ค์ ์น์ ์์๋ ์ฌ๋ผ์ด์ค์ ๋งต์ ์ฑ๋ฅ์ ๋น๊ตํด๋ณผ ๊ฑฐ์์. ๊ฐ ์๋ฃ๊ตฌ์กฐ์ ์ฅ๋จ์ ์ ์ดํดํ๋ฉด ์ํฉ์ ๋ฐ๋ผ ๊ฐ์ฅ ์ ํฉํ ๋๊ตฌ๋ฅผ ์ ํํ ์ ์์ ๊ฑฐ์์. Go ํ๋ก๊ทธ๋๋ฐ์ ๋ฌ์ธ์ด ๋๋ ์ฌ์ , ๊ณ์ ์ด์ด๊ฐ๋ณผ๊น์? Let's Go! ๐
๐ ์ฌ๋ผ์ด์ค์ ๋งต์ ์ฑ๋ฅ ๋น๊ต
์, ์ด์ ์ฌ๋ผ์ด์ค์ ๋งต์ ๊น์ด ์๊ฒ ์ดํด๋ดค์ผ๋, ๋ ์๋ฃ๊ตฌ์กฐ์ ์ฑ๋ฅ์ ๋น๊ตํด๋ณผ ์ฐจ๋ก์์. ๊ฐ๊ฐ์ ์ฅ๋จ์ ์ ์ดํดํ๋ฉด ์ํฉ์ ๋ฐ๋ผ ๊ฐ์ฅ ์ ํฉํ ๋๊ตฌ๋ฅผ ์ ํํ ์ ์์ ๊ฑฐ์์. ์ค๋น๋์ จ๋์? ์ฑ๋ฅ ๋๊ฒฐ์ ์์ํด๋ณผ๊น์? ๐๏ธ๐จ
1. ์ ๊ทผ ์๋
์ฌ๋ผ์ด์ค๋ ์ธ๋ฑ์ค๋ฅผ ํตํ ์ ๊ทผ์ด O(1)์ ์๊ฐ ๋ณต์ก๋๋ฅผ ๊ฐ์ ธ์. ์ฆ, ์ฌ๋ผ์ด์ค์ ํฌ๊ธฐ์ ์๊ด์์ด ํญ์ ์ผ์ ํ ์๊ฐ์ด ๊ฑธ๋ ค์.
๋งต๋ ํค๋ฅผ ํตํ ์ ๊ทผ์ด ํ๊ท ์ ์ผ๋ก O(1)์ ์๊ฐ ๋ณต์ก๋๋ฅผ ๊ฐ์ ธ์. ํ์ง๋ง ์ต์ ์ ๊ฒฝ์ฐ(๋ชจ๋ ํค๊ฐ ๊ฐ์ ํด์ ๊ฐ์ ๊ฐ์ง ๋) O(n)์ด ๋ ์ ์์ด์.
func accessTest() {
slice := make([]int, 1000000)
m := make(map[int]int)
for i := 0; i < 1000000; i++ {
slice[i] = i
m[i] = i
}
start := time.Now()
_ = slice[999999]
fmt.Printf("์ฌ๋ผ์ด์ค ์ ๊ทผ ์๊ฐ: %v\n", time.Since(start))
start = time.Now()
_ = m[999999]
fmt.Printf("๋งต ์ ๊ทผ ์๊ฐ: %v\n", time.Since(start))
}
์ด ํ ์คํธ๋ฅผ ์คํํด๋ณด๋ฉด, ๋๋ถ๋ถ์ ๊ฒฝ์ฐ ์ฌ๋ผ์ด์ค๊ฐ ๋งต๋ณด๋ค ์ฝ๊ฐ ๋ ๋น ๋ฅธ ์ ๊ทผ ์๋๋ฅผ ๋ณด์ฌ์ค ๊ฑฐ์์.
2. ์ฝ์ ์๋
์ฌ๋ผ์ด์ค์ ๋์ ์์๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ O(1)์ ์๊ฐ ๋ณต์ก๋๋ฅผ ๊ฐ์ ธ์. ํ์ง๋ง ์ค๊ฐ์ ์ฝ์ ํ๋ ๊ฒฝ์ฐ O(n)์ด ๋ ์ ์์ด์.
๋งต์ ์๋ก์ด ํค-๊ฐ ์์ ์ถ๊ฐํ๋ ๊ฒ์ ํ๊ท ์ ์ผ๋ก O(1)์ ์๊ฐ ๋ณต์ก๋๋ฅผ ๊ฐ์ ธ์.
func insertionTest() {
slice := make([]int, 0)
m := make(map[int]int)
start := time.Now()
for i := 0; i < 1000000; i++ {
slice = append(slice, i)
}
fmt.Printf("์ฌ๋ผ์ด์ค ์ฝ์
์๊ฐ: %v\n", time.Since(start))
start = time.Now()
for i := 0; i < 1000000; i++ {
m[i] = i
}
fmt.Printf("๋งต ์ฝ์
์๊ฐ: %v\n", time.Since(start))
}
์ด ํ ์คํธ์์๋ ๋๋์ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ ํ ๋ ๋งต์ด ์ฌ๋ผ์ด์ค๋ณด๋ค ์ฝ๊ฐ ๋ ๋๋ฆด ์ ์์ด์. ํ์ง๋ง ์ค๊ฐ ์ฝ์ ์ด ํ์ํ ๊ฒฝ์ฐ์๋ ๋งต์ด ํจ์ฌ ํจ์จ์ ์ด์์.
3. ๊ฒ์ ์๋
์ฌ๋ผ์ด์ค์์ ํน์ ๊ฐ์ ์ฐพ๋ ๊ฒ์ O(n)์ ์๊ฐ ๋ณต์ก๋๋ฅผ ๊ฐ์ ธ์. ์ ์ฒด๋ฅผ ์ํํด์ผ ํ๊ธฐ ๋๋ฌธ์ด์ฃ .
๋งต์์ ํน์ ํค๋ฅผ ์ฐพ๋ ๊ฒ์ ํ๊ท ์ ์ผ๋ก O(1)์ ์๊ฐ ๋ณต์ก๋๋ฅผ ๊ฐ์ ธ์.
func searchTest() {
slice := make([]int, 1000000)
m := make(map[int]bool)
for i := 0; i < 1000000; i++ {
slice[i] = i
m[i] = true
}
start := time.Now()
for _, v := range slice {
if v == 999999 {
break
}
}
fmt.Printf("์ฌ๋ผ์ด์ค ๊ฒ์ ์๊ฐ: %v\n", time.Since(start))
start = time.Now()
_ = m[999999]
fmt.Printf("๋งต ๊ฒ์ ์๊ฐ: %v\n", time.Since(start))
}
์ด ํ ์คํธ์์๋ ๋งต์ด ์ฌ๋ผ์ด์ค๋ณด๋ค ํจ์ฌ ๋น ๋ฅธ ๊ฒ์ ์๋๋ฅผ ๋ณด์ฌ์ค ๊ฑฐ์์.
4. ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋
์ฌ๋ผ์ด์ค๋ ์ฐ์๋ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ์ฌ์ฉํด์. ๋ฐ๋ผ์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ์ด ํจ์จ์ ์ด๊ณ ์์ธก ๊ฐ๋ฅํด์.
๋งต์ ํด์ ํ ์ด๋ธ ๊ตฌ์กฐ ๋๋ฌธ์ ์ถ๊ฐ์ ์ธ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฌ์ฉํด์. ๋ํ ๋ก๋ ํฉํฐ์ ๋ฐ๋ผ ๋ด๋ถ์ ์ผ๋ก ๋ฆฌ์ฌ์ด์ง์ด ์ผ์ด๋ ์ ์์ด์.
func memoryTest() {
var m1, m2 runtime.MemStats
runtime.ReadMemStats(&m1)
slice := make([]int, 1000000)
for i := 0; i < 1000000; i++ {
slice[i] = i
}
runtime.ReadMemStats(&m2)
fmt.Printf("์ฌ๋ผ์ด์ค ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋: %v MB\n", (m2.Alloc - m1.Alloc) / 1024 / 1024)
runtime.ReadMemStats(&m1)
m := make(map[int]int)
for i := 0; i < 1000000; i++ {
m[i] = i
}
runtime.ReadMemStats(&m2)
fmt.Printf("๋งต ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋: %v MB\n", (m2.Alloc - m1.Alloc) / 1024 / 1024)
}
์ด ํ ์คํธ์์๋ ๋๋ถ๋ถ์ ๊ฒฝ์ฐ ๋งต์ด ์ฌ๋ผ์ด์ค๋ณด๋ค ๋ ๋ง์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๋ณผ ์ ์์ด์.
5. ์ ๋ ฌ
์ฌ๋ผ์ด์ค๋ ์ฝ๊ฒ ์ ๋ ฌํ ์ ์์ด์. Go์ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ์ ๊ณตํ๋ sort ํจํค์ง๋ฅผ ์ฌ์ฉํ๋ฉด ๋ผ์.
๋งต์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ๋ ฌ์ด ๋ถ๊ฐ๋ฅํด์. ์ ๋ ฌ์ด ํ์ํ ๊ฒฝ์ฐ ํค๋ ๊ฐ์ ์ฌ๋ผ์ด์ค๋ก ์ถ์ถํ ํ ์ ๋ ฌํด์ผ ํด์.
func sortTest() {
slice := make([]int, 1000000)
m := make(map[int]int)
for i := 0; i < 1000000; i++ {
slice[i] = rand.Intn(1000000)
m[i] = rand.Intn(1000000)
}
start := time.Now()
sort.Ints(slice)
fmt.Printf("์ฌ๋ผ์ด์ค ์ ๋ ฌ ์๊ฐ: %v\n", time.Since(start))
start = time.Now()
keys := make([]int, 0, len(m))
for k := range m {
keys = append(keys, k)
}
sort.Ints(keys)
fmt.Printf("๋งต ํค ์ ๋ ฌ ์๊ฐ: %v\n", time.Since(start))
}
์ด ํ ์คํธ์์๋ ์ฌ๋ผ์ด์ค์ ์ ๋ ฌ์ด ๋งต์ ํค๋ฅผ ์ ๋ ฌํ๋ ๊ฒ๋ณด๋ค ํจ์ฌ ๋น ๋ฅธ ๊ฒ์ ๋ณผ ์ ์์ด์.
๐ก Pro Tip: ์ฑ๋ฅ ๋น๊ต๋ ํญ์ ์ค์ ์ฌ์ฉ ์ฌ๋ก์ ๋ฐ์ดํฐ ํน์ฑ์ ๊ณ ๋ คํด์ผ ํด์. ๋ฒค์น๋งํฌ ํ ์คํธ๋ฅผ ํตํด ์ฌ๋ฌ๋ถ์ ํน์ ์ํฉ์์ ์ด๋ค ์๋ฃ๊ตฌ์กฐ๊ฐ ๋ ํจ์จ์ ์ธ์ง ํ์ธํด๋ณด์ธ์!
๊ฒฐ๋ก
- ์ฌ๋ผ์ด์ค
- ์์ฐจ์ ์ธ ๋ฐ์ดํฐ ์ ๊ทผ์ด ํ์ํ ๋
- ์ธ๋ฑ์ค๋ฅผ ํตํ ๋น ๋ฅธ ์ ๊ทผ์ด ํ์ํ ๋
- ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ์ ์ต์ํํด์ผ ํ ๋
- ๋ฐ์ดํฐ์ ์์๊ฐ ์ค์ํ๊ฑฐ๋ ์์ฃผ ์ ๋ ฌํด์ผ ํ ๋
- ๋งต์ ๋ค์๊ณผ ๊ฐ์ ๊ฒฝ์ฐ์ ์ ๋ฆฌํด์:
- ํค๋ฅผ ํตํ ๋น ๋ฅธ ๊ฒ์์ด ํ์ํ ๋
- ๋ฐ์ดํฐ์ ์ฝ์ ๊ณผ ์ญ์ ๊ฐ ๋น๋ฒํ ๋
- ํค-๊ฐ ์์ ๊ด๊ณ๊ฐ ์ค์ํ ๋
- ์ค๋ณต ๋ฐ์ดํฐ๋ฅผ ์ ๊ฑฐํด์ผ ํ ๋
์ค์ ๋ก๋ ๋ ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ ์ ํ ์กฐํฉํด์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์์. ์๋ฅผ ๋ค์ด, ๋งต์ ๊ฐ์ผ๋ก ์ฌ๋ผ์ด์ค๋ฅผ ์ฌ์ฉํ๋ฉด ๋ณต์กํ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ํจ์จ์ ์ผ๋ก ํํํ ์ ์์ฃ .
์ค์ ์์ : ์ฑ๋ฅ ๋น๊ต ๋ฒค์น๋งํฌ
์ด์ ์ฐ๋ฆฌ๊ฐ ๋ฐฐ์ด ๋ด์ฉ์ ๋ฐํ์ผ๋ก ์ฌ๋ผ์ด์ค์ ๋งต์ ์ฑ๋ฅ์ ๋น๊ตํ๋ ๋ฒค์น๋งํฌ ํ ์คํธ๋ฅผ ์์ฑํด๋ณผ๊น์?
package main
import (
"testing"
"math/rand"
)
func BenchmarkSliceAccess(b *testing.B) {
slice := make([]int, 1000000)
for i := 0; i < 1000000; i++ {
slice[i] = i
}
b.ResetTimer()
for i := 0; i < b.N; i++ {
_ = slice[rand.Intn(1000000)]
}
}
func BenchmarkMapAccess(b *testing.B) {
m := make(map[int]int)
for i := 0; i < 1000000; i++ {
m[i] = i
}
b.ResetTimer()
for i := 0; i < b.N; i++ {
_ = m[rand.Intn(1000000)]
}
}
func BenchmarkSliceSearch(b *testing.B) {
slice := make([]int, 1000000)
for i := 0; i < 1000000; i++ {
slice[i] = i
}
b.ResetTimer()
for i := 0; i < b.N; i++ {
target := rand.Intn(1000000)
for _, v := range slice {
if v == target {
break
}
}
}
}
func BenchmarkMapSearch(b *testing.B) {
m := make(map[int]bool)
for i := 0; i < 1000000; i++ {
m[i] = true
}
b.ResetTimer()
for i := 0; i < b.N; i++ {
_ = m[rand.Intn(1000000)]
}
}
์ด ๋ฒค์น๋งํฌ ํ ์คํธ๋ฅผ ์คํํ๋ฉด ์ฌ๋ผ์ด์ค์ ๋งต์ ์ ๊ทผ ์๋์ ๊ฒ์ ์๋๋ฅผ ๋น๊ตํ ์ ์์ด์. ํฐ๋ฏธ๋์์ ๋ค์ ๋ช ๋ น์ด๋ฅผ ์คํํด๋ณด์ธ์:
go test -bench=. -benchmem
๊ฒฐ๊ณผ๋ฅผ ๋ถ์ํด๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ์ ์ ์ ์ ์ ์์ ๊ฑฐ์์:
- ์ฌ๋ผ์ด์ค์ ์ ๊ทผ ์๋๊ฐ ๋งต๋ณด๋ค ์ฝ๊ฐ ๋ ๋น ๋ฅผ ์ ์์ด์.
- ๊ฒ์์์๋ ๋งต์ด ์ฌ๋ผ์ด์ค๋ณด๋ค ํจ์ฌ ๋ฐ์ด๋ ์ฑ๋ฅ์ ๋ณด์ฌ์ค ๊ฑฐ์์.
- ๋งต์ด ์ฌ๋ผ์ด์ค๋ณด๋ค ๋ ๋ง์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ํ์ธํ ์ ์์ด์.
๐ Fun Fact: Go์ ๋ฒค์น๋งํน ๋๊ตฌ๋ ์ ๋ง ๊ฐ๋ ฅํด์! ์ฌ๋ฌ๋ถ์ ์ฝ๋ ์ฑ๋ฅ์ ์ฝ๊ฒ ์ธก์ ํ๊ณ ๋น๊ตํ ์ ์์ฃ . ์ด๋ฐ ๋๊ตฌ๋ฅผ ํ์ฉํ๋ฉด ๋ฐ์ดํฐ ๊ธฐ๋ฐ์ ์ต์ ํ ๊ฒฐ์ ์ ๋ด๋ฆด ์ ์์ด์. ๋ง์น F1 ๋ ์ด์ฑ ํ์ด ์๋์ฐจ์ ์ฑ๋ฅ์ ์ธก์ ํ๊ณ ๊ฐ์ ํ๋ ๊ฒ์ฒ๋ผ์! ๐๏ธ
์, ์ด์ ์ฌ๋ผ์ด์ค์ ๋งต์ ์ฑ๋ฅ์ ๊น์ด ์๊ฒ ๋น๊ตํด๋ดค์ด์. ์ด๋ ์ ๊ฐ์? ๊ฐ ์๋ฃ๊ตฌ์กฐ์ ์ฅ๋จ์ ์ ์ดํดํ์ จ๋์? ์ด์ ์ฌ๋ฌ๋ถ์ ์ํฉ์ ๋ฐ๋ผ ๊ฐ์ฅ ์ ํฉํ ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ ํํ ์ ์๋ ์ง์์ ๊ฐ์ถ๊ฒ ๋์ด์! ๐
Go ํ๋ก๊ทธ๋๋ฐ์์ ์ฌ๋ผ์ด์ค์ ๋งต์ ์ ๋ง ์ค์ํ ๋๊ตฌ์์. ์ด ๋ ๊ฐ์ง๋ฅผ ์ ํ์ฉํ๋ฉด ํจ์จ์ ์ด๊ณ ๊ฐ๋ ฅํ ํ๋ก๊ทธ๋จ์ ๋ง๋ค ์ ์์ด์. ์ฌ๋ฅ๋ท์์ ๋ฐฐ์ด ์ด๋ฐ ์ง์๋ค์ด ์ฌ๋ฌ๋ถ์ ํ๋ก๊ทธ๋๋ฐ ์ค๋ ฅ์ ํ ๋จ๊ณ ๋ ๋์ฌ์ค ๊ฑฐ์์.
๋ค์ ์น์ ์์๋ ์ง๊ธ๊น์ง ๋ฐฐ์ด ๋ด์ฉ์ ์ข ํฉํด์ ์ค์ ์์ ๋ฅผ ๋ง๋ค์ด๋ณผ ๊ฑฐ์์. ์ฌ๋ผ์ด์ค์ ๋งต์ ํ์ฉํด ์ค์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ์ ๋ฐฐ์๋ณผ๊น์? Go ํ๋ก๊ทธ๋๋ฐ ๋ง์คํฐ๊ฐ ๋๋ ์ฌ์ , ๊ณ์ ์ด์ด๊ฐ๋ณผ๊น์? Let's Go! ๐
๐ฏ ์ค์ ์์ : ๋์ ๊ด๋ฆฌ ์์คํ
์, ์ด์ ์ฐ๋ฆฌ๊ฐ ๋ฐฐ์ด ๋ชจ๋ ๋ด์ฉ์ ์ข ํฉํด์ ์ค์ ๋ก ์ ์ฉํ ํ๋ก๊ทธ๋จ์ ๋ง๋ค์ด๋ณผ ๊ฑฐ์์. ์ฌ๋ผ์ด์ค์ ๋งต์ ํ์ฉํด ๊ฐ๋จํ ๋์ ๊ด๋ฆฌ ์์คํ ์ ๊ตฌํํด๋ณผ๊น์? ์ด ์์ ๋ฅผ ํตํด ์ค์ ์ํฉ์์ ์ด๋ป๊ฒ ์ฌ๋ผ์ด์ค์ ๋งต์ ํ์ฉํ๋์ง ๋ฐฐ์ธ ์ ์์ ๊ฑฐ์์. ์ค๋น๋์ จ๋์? ์์ํด๋ณผ๊น์? ๐
1. ํ๋ก๊ทธ๋จ ๊ตฌ์กฐ ์ค๊ณ
๋จผ์ ์ฐ๋ฆฌ์ ๋์ ๊ด๋ฆฌ ์์คํ ์ด ๊ฐ์ถฐ์ผ ํ ๊ธฐ๋ฅ๋ค์ ์ ์ํด๋ณผ๊ฒ์:
- ๋์ ์ถ๊ฐ
- ๋์ ๊ฒ์ (์ ๋ชฉ ๋๋ ์ ์๋ก)
- ๋์ ๋์ถ ๋ฐ ๋ฐ๋ฉ
- ์ ์ฒด ๋์ ๋ชฉ๋ก ์ถ๋ ฅ
- ๊ฐ์ฅ ์ธ๊ธฐ ์๋ ๋์ ๋ชฉ๋ก ์ถ๋ ฅ
์ด ๊ธฐ๋ฅ๋ค์ ๊ตฌํํ๊ธฐ ์ํด ์ฌ๋ผ์ด์ค์ ๋งต์ ์ด๋ป๊ฒ ํ์ฉํ ์ ์์์ง ์๊ฐํด๋ณผ๊น์?
2. ์ฝ๋ ๊ตฌํ
package main
import (
"fmt"
"sort"
"strings"
)
type Book struct {
Title string
Author string
ISBN string
Borrowed bool
BorrowCount int
}
type Library struct {
Books []Book
BooksByISBN map[string]*Book
BooksByTitle map[string][]*Book
}
func NewLibrary() *Library {
return &Library{
Books: make([]Book, 0),
BooksByISBN: make(map[string]*Book),
BooksByTitle: make(map[string][]*Book),
}
}
func (l *Library) AddBook(title, author, isbn string) {
book := Book{Title: title, Author: author, ISBN: isbn}
l.Books = append(l.Books, book)
l.BooksByISBN[isbn] = &l.Books[len(l.Books)-1]
titleLower := strings.ToLower(title)
l.BooksByTitle[titleLower] = append(l.BooksByTitle[titleLower], &l.Books[len(l.Books)-1])
}
func (l *Library) SearchBook(query string) []*Book {
query = strings.ToLower(query)
var results []*Book
// ์ ๋ชฉ์ผ๋ก ๊ฒ์
if books, ok := l.BooksByTitle[query]; ok {
results = append(results, books...)
}
// ISBN์ผ๋ก ๊ฒ์
if book, ok := l.BooksByISBN[query]; ok {
results = append(results, book)
}
// ์ ์๋ก ๊ฒ์
for i := range l.Books {
if strings.Contains(strings.ToLower(l.Books[i].Author), query) {
results = append(results, &l.Books[i])
}
}
return results
}
func (l *Library) BorrowBook(isbn string) bool {
if book, ok := l.BooksByISBN[isbn]; ok && !book.Borrowed {
book.Borrowed = true
book.BorrowCount++
return true
}
return false
}
func (l *Library) ReturnBook(isbn string) bool {
if book, ok := l.BooksByISBN[isbn]; ok && book.Borrowed {
book.Borrowed = false
return true
}
return false
}
func (l *Library) PrintAllBooks() {
fmt.Println("๋์ ๋ชฉ๋ก:")
for _, book := range l.Books {
status := "๋์ถ ๊ฐ๋ฅ"
if book.Borrowed {
status = "๋์ถ ์ค"
}
fmt.Printf("%s by %s (ISBN: %s) - %s\n", book.Title, book.Author, book.ISBN, status)
}
}
func (l *Library) PrintPopularBooks(n int) {
type BookWithCount struct {
*Book
Count int
}
popularBooks := make([]BookWithCount, len(l.Books))
for i, book := range l.Books {
popularBooks[i] = BookWithCount{&book, book.BorrowCount}
}
sort.Slice(popularBooks, func(i, j int) bool {
return popularBooks[i].Count > popularBooks[j].Count
})
fmt.Printf("๊ฐ์ฅ ์ธ๊ธฐ ์๋ %d๊ถ์ ๋์:\n", n)
for i := 0; i < n && i < len(popularBooks); i++ {
book := popularBooks[i]
fmt.Printf("%d. %s by %s (๋์ถ ํ์: %d)\n", i+1, book.Title, book.Author, book.Count)
}
}
func main() {
library := NewLibrary()
// ๋์ ์ถ๊ฐ
library.AddBook("The Go Programming Language", "Alan A. A. Donovan", "978-0134190440")
library.AddBook("Grokking Algorithms", "Aditya Bhargava", "978-1617292231")
library.AddBook("Clean Code", "Robert C. Martin", "978-0132350884")
library.AddBook("The Art of Computer Programming", "Donald E. Knuth", "978-0201896831")
// ๋์ ๊ฒ์
fmt.Println("'go'๋ก ๊ฒ์ํ ๊ฒฐ๊ณผ:")
for _, book := range library.SearchBook("go") {
fmt.Printf("%s by %s\n", book.Title, book.Author)
}
// ๋์ ๋์ถ
fmt.Println("\n๋์ ๋์ถ:")
if library.BorrowBook("978-0134190440") {
fmt.Println("'The Go Programming Language' ๋์ถ ์ฑ๊ณต")
}
if library.BorrowBook("978-1617292231") {
fmt.Println("'Grokking Algorithms' ๋์ถ ์ฑ๊ณต")
}
// ์ ์ฒด ๋์ ๋ชฉ๋ก ์ถ๋ ฅ
fmt.Println()
library.PrintAllBooks()
// ๋์ ๋ฐ๋ฉ
fmt.Println("\n๋์ ๋ฐ๋ฉ:")
if library.ReturnBook("978-0134190440") {
fmt.Println("'The Go Programming Language' ๋ฐ๋ฉ ์ฑ๊ณต")
}
// ์ธ๊ธฐ ๋์ ์ถ๋ ฅ
fmt.Println()
library.PrintPopularBooks(3)
}
3. ์ฝ๋ ์ค๋ช
์ด ํ๋ก๊ทธ๋จ์์ ์ฐ๋ฆฌ๋ ์ฌ๋ผ์ด์ค์ ๋งต์ ๋ค์๊ณผ ๊ฐ์ด ํ์ฉํ์ด์:
- ์ฌ๋ผ์ด์ค (
Books []Book
): ์ ์ฒด ๋์ ๋ชฉ๋ก์ ์ ์ฅํ๊ณ , ์์ฐจ์ ์ผ๋ก ์ ๊ทผํ ๋ ์ฌ์ฉํด์. - ๋งต (
BooksByISBN map[string]*Book
): ISBN์ ํค๋ก ์ฌ์ฉํด ๋น ๋ฅด๊ฒ ํน์ ๋์์ ์ ๊ทผํ ์ ์์ด์. - ๋งต (
BooksByTitle map[string][]*Book
): ์ ๋ชฉ์ ํค๋ก ์ฌ์ฉํด ๊ฐ์ ์ ๋ชฉ์ ์ฌ๋ฌ ๋์๋ฅผ ์ ์ฅํ๊ณ ๊ฒ์ํ ์ ์์ด์.
๊ฐ ์๋ฃ๊ตฌ์กฐ์ ์ฅ์ ์ ํ์ฉํด ํจ์จ์ ์ธ ๋์ ๊ด๋ฆฌ ์์คํ ์ ๊ตฌํํ์ด์:
- ์ฌ๋ผ์ด์ค๋ฅผ ์ฌ์ฉํด ์ ์ฒด ๋์ ๋ชฉ๋ก์ ์ฝ๊ฒ ์ํํ๊ณ ์ถ๋ ฅํ ์ ์์ด์.
- ISBN์ผ๋ก ๋งต์ ๋ง๋ค์ด ํน์ ๋์๋ฅผ O(1) ์๊ฐ์ ์ฐพ์ ์ ์์ด์.
- ์ ๋ชฉ์ผ๋ก ๋งต์ ๋ง๋ค์ด ์ ์ฌํ ์ ๋ชฉ์ ๋์๋ค์ ๊ทธ๋ฃนํํ๊ณ ๋น ๋ฅด๊ฒ ๊ฒ์ํ ์ ์์ด์.
- ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํด ์ธ๊ธฐ ์๋ ๋์ ๋ชฉ๋ก์ ๋ง๋ค ์ ์์ด์.
๐ก Pro Tip: ์ค์ ํ๋ก๊ทธ๋จ์์๋ ๋์์ฑ ๋ฌธ์ ๋ฅผ ๊ณ ๋ คํด์ผ ํด์. ์ฌ๋ฌ ์ฌ์ฉ์๊ฐ ๋์์ ๋์๋ฅผ ๋์ถํ๊ฑฐ๋ ๋ฐ๋ฉํ ์ ์๊ธฐ ๋๋ฌธ์ด์ฃ . Go์ ๋์์ฑ ๊ธฐ๋ฅ(์: ๋ฎคํ ์ค, ์ฑ๋)์ ํ์ฉํด ์ด๋ฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์ด์!
4. ํ๋ก๊ทธ๋จ ์คํ ๊ฒฐ๊ณผ
์ด ํ๋ก๊ทธ๋จ์ ์คํํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ๋ณผ ์ ์์ด์:
'go'๋ก ๊ฒ์ํ ๊ฒฐ๊ณผ:
The Go Programming Language by Alan A. A. Donovan
Grokking Algorithms by Aditya Bhargava
๋์ ๋์ถ:
'The Go Programming Language' ๋์ถ ์ฑ๊ณต
'Grokking Algorithms' ๋์ถ ์ฑ๊ณต
๋์ ๋ชฉ๋ก:
The Go Programming Language by Alan A. A. Donovan (ISBN: 978-0134190440) - ๋์ถ ์ค
Grokking Algorithms by Aditya Bhargava (ISBN: 978-1617292231) - ๋์ถ ์ค
Clean Code by Robert C. Martin (ISBN: 978-0132350884) - ๋์ถ ๊ฐ๋ฅ
The Art of Computer Programming by Donald E. Knuth (ISBN: 978-0201896831) - ๋์ถ ๊ฐ๋ฅ
๋์ ๋ฐ๋ฉ:
'The Go Programming Language' ๋ฐ๋ฉ ์ฑ๊ณต
๊ฐ์ฅ ์ธ๊ธฐ ์๋ 3๊ถ์ ๋์:
1. The Go Programming Language by Alan A. A. Donovan (๋์ถ ํ์: 1)
2. Grokking Algorithms by Aditya Bhargava (๋์ถ ํ์: 1)
3. Clean Code by Robert C. Martin (๋์ถ ํ์: 0)
์ด ์์ ๋ฅผ ํตํด ์ฐ๋ฆฌ๋ ์ฌ๋ผ์ด์ค์ ๋งต์ ์ค์ ์ํฉ์์ ์ด๋ป๊ฒ ํ์ฉํ ์ ์๋์ง ๋ฐฐ์ ์ด์. ๊ฐ ์๋ฃ๊ตฌ์กฐ์ ์ฅ์ ์ ์ด๋ ค ํจ์จ์ ์ด๊ณ ์ฌ์ฉํ๊ธฐ ์ฌ์ด ํ๋ก๊ทธ๋จ์ ๋ง๋ค ์ ์์์ฃ .
๐ Fun Fact: ์ด๋ฐ ์ข ๋ฅ์ ์์คํ ์ ์ค์ ๋ก ๋์๊ด์์ ์ฌ์ฉ๋๊ณ ์์ด์! ์ฌ๋ฌ๋ถ์ด ๋ฐฉ๊ธ ๋ง๋ ํ๋ก๊ทธ๋จ์ ๋ ๋ณต์กํ ๋ฒ์ ์ด ์ ์ธ๊ณ์ ๋์๊ด์์ ์๋ฐฑ๋ง ๊ถ์ ์ฑ ์ ๊ด๋ฆฌํ๊ณ ์๋ต๋๋ค. ์ฌ๋ฌ๋ถ๋ ์ด์ ๊ทธ๋ฐ ์์คํ ์ ๊ธฐ์ด๋ฅผ ์ดํดํ๊ฒ ๋ ๊ฑฐ์์!
์, ์ด์ ์ฐ๋ฆฌ๋ Go์ ์ฌ๋ผ์ด์ค์ ๋งต์ ๊น์ด ์๊ฒ ์ดํดํ๊ณ , ์ค์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐ ํ์ฉํ ์ ์๊ฒ ๋์ด์. ์ด๋ ์ ๊ฐ์? ์ด์ ์ฌ๋ฌ๋ถ์ Go ํ๋ก๊ทธ๋๋ฐ์ ๊ฐ๋ ฅํ ๋๊ตฌ๋ค์ ์์ ์์ฌ๋ก ๋ค๋ฃฐ ์ ์๋ ์ค๋ ฅ์ ๊ฐ์ถ๊ฒ ๋์ด์! ๐
์ด๋ฐ ์ง์๊ณผ ๊ฒฝํ์ ๋ฐํ์ผ๋ก ์ฌ๋ฌ๋ถ๋ง์ ํ๋ก์ ํธ๋ฅผ ์์ํด๋ณด๋ ๊ฑด ์ด๋จ๊น์? ์ฌ๋ฅ๋ท์์ ๋ฐฐ์ด ๋ด์ฉ์ ํ์ฉํด ๋ ๋ณต์กํ๊ณ ํฅ๋ฏธ๋ก์ด ํ๋ก๊ทธ๋จ์ ๋ง๋ค์ด๋ณด์ธ์. Go ํ๋ก๊ทธ๋๋ฐ์ ์ธ๊ณ๋ ์ ๋ง ๋๊ณ ๊น๋ต๋๋ค. ์ฌ๋ฌ๋ถ์ ์์๋ ฅ์ด ์ด ์ธ๊ณ๋ฅผ ๋์ฑ ํ์ฑํ๊ฒ ๋ง๋ค ๊ฑฐ์์!
Go ํ๋ก๊ทธ๋๋ฐ ๋ง์คํฐ๊ฐ ๋๋ ์ฌ์ , ์ฌ๊ธฐ์ ๋์ด ์๋์์. ๊ณ์ํด์ ํ์ตํ๊ณ , ์คํํ๊ณ , ์ฑ์ฅํด ๋๊ฐ์ธ์. ์ฌ๋ฌ๋ถ์ ๊ฟ์ Go๋ก ์คํ์์ผ ๋ณด์ธ์. ํ์ดํ ! ๐
- ์ง์์ธ์ ์ฒ - ์ง์ ์ฌ์ฐ๊ถ ๋ณดํธ ๊ณ ์ง
์ง์ ์ฌ์ฐ๊ถ ๋ณดํธ ๊ณ ์ง
- ์ ์๊ถ ๋ฐ ์์ ๊ถ: ๋ณธ ์ปจํ ์ธ ๋ ์ฌ๋ฅ๋ท์ ๋ ์ AI ๊ธฐ์ ๋ก ์์ฑ๋์์ผ๋ฉฐ, ๋ํ๋ฏผ๊ตญ ์ ์๊ถ๋ฒ ๋ฐ ๊ตญ์ ์ ์๊ถ ํ์ฝ์ ์ํด ๋ณดํธ๋ฉ๋๋ค.
- AI ์์ฑ ์ปจํ ์ธ ์ ๋ฒ์ ์ง์: ๋ณธ AI ์์ฑ ์ปจํ ์ธ ๋ ์ฌ๋ฅ๋ท์ ์ง์ ์ฐฝ์๋ฌผ๋ก ์ธ์ ๋๋ฉฐ, ๊ด๋ จ ๋ฒ๊ท์ ๋ฐ๋ผ ์ ์๊ถ ๋ณดํธ๋ฅผ ๋ฐ์ต๋๋ค.
- ์ฌ์ฉ ์ ํ: ์ฌ๋ฅ๋ท์ ๋ช ์์ ์๋ฉด ๋์ ์์ด ๋ณธ ์ปจํ ์ธ ๋ฅผ ๋ณต์ , ์์ , ๋ฐฐํฌ, ๋๋ ์์ ์ ์ผ๋ก ํ์ฉํ๋ ํ์๋ ์๊ฒฉํ ๊ธ์ง๋ฉ๋๋ค.
- ๋ฐ์ดํฐ ์์ง ๊ธ์ง: ๋ณธ ์ปจํ ์ธ ์ ๋ํ ๋ฌด๋จ ์คํฌ๋ํ, ํฌ๋กค๋ง, ๋ฐ ์๋ํ๋ ๋ฐ์ดํฐ ์์ง์ ๋ฒ์ ์ ์ฌ์ ๋์์ด ๋ฉ๋๋ค.
- AI ํ์ต ์ ํ: ์ฌ๋ฅ๋ท์ AI ์์ฑ ์ปจํ ์ธ ๋ฅผ ํ AI ๋ชจ๋ธ ํ์ต์ ๋ฌด๋จ ์ฌ์ฉํ๋ ํ์๋ ๊ธ์ง๋๋ฉฐ, ์ด๋ ์ง์ ์ฌ์ฐ๊ถ ์นจํด๋ก ๊ฐ์ฃผ๋ฉ๋๋ค.
์ฌ๋ฅ๋ท์ ์ต์ AI ๊ธฐ์ ๊ณผ ๋ฒ๋ฅ ์ ๊ธฐ๋ฐํ์ฌ ์์ฌ์ ์ง์ ์ฌ์ฐ๊ถ์ ์ ๊ทน์ ์ผ๋ก ๋ณดํธํ๋ฉฐ,
๋ฌด๋จ ์ฌ์ฉ ๋ฐ ์นจํด ํ์์ ๋ํด ๋ฒ์ ๋์์ ํ ๊ถ๋ฆฌ๋ฅผ ๋ณด์ ํฉ๋๋ค.
ยฉ 2025 ์ฌ๋ฅ๋ท | All rights reserved.
๋๊ธ 0๊ฐ