๐Ÿš€ Go ์–ธ์–ด์˜ ์Šฌ๋ผ์ด์Šค์™€ ๋งต ์‹ฌ์ธต ๋ถ„์„ ๐Ÿง 

์ฝ˜ํ…์ธ  ๋Œ€ํ‘œ ์ด๋ฏธ์ง€ - ๐Ÿš€ 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]

์ด๋ ‡๊ฒŒ ์Šฌ๋ผ์ด์‹ฑ์„ ํ•˜๋ฉด, ์›๋ณธ ์Šฌ๋ผ์ด์Šค์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ณต์œ ํ•˜๋ฉด์„œ ์ƒˆ๋กœ์šด ๋ทฐ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์–ด์š”. ๋งˆ์น˜ ๊ฐ™์€ ํ’๊ฒฝ์„ ๋‹ค๋ฅธ ๊ฐ๋„์—์„œ ๋ณด๋Š” ๊ฒƒ์ฒ˜๋Ÿผ์š”! ๐Ÿ“ธ

์Šฌ๋ผ์ด์‹ฑ ์‹œ๊ฐํ™” ์›๋ณธ ์Šฌ๋ผ์ด์Šค 0 1 2 3 4 5 numbers[2:4] 2 3

์Šฌ๋ผ์ด์‹ฑ์€ ์ •๋ง ํŽธ๋ฆฌํ•˜์ง€๋งŒ, ์ฃผ์˜ํ•ด์•ผ ํ•  ์ ๋„ ์žˆ์–ด์š”. ์Šฌ๋ผ์ด์‹ฑ์œผ๋กœ ๋งŒ๋“  ์ƒˆ ์Šฌ๋ผ์ด์Šค๋Š” ์›๋ณธ ์Šฌ๋ผ์ด์Šค์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ณต์œ ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ์ƒˆ ์Šฌ๋ผ์ด์Šค๋ฅผ ์ˆ˜์ •ํ•˜๋ฉด ์›๋ณธ ์Šฌ๋ผ์ด์Šค๋„ ํ•จ๊ป˜ ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ์–ด์š”. ์ด๊ฑด ๋งˆ์น˜ ํŠธ์œˆ ํ…”๋ ˆํŒŒ์‹œ ๊ฐ™์€ ๊ฑฐ์ฃ ! ๐Ÿ‘ฏโ€โ™€๏ธ

์Šฌ๋ผ์ด์Šค ํ™•์žฅํ•˜๊ธฐ

์Šฌ๋ผ์ด์Šค์˜ ๋˜ ๋‹ค๋ฅธ ๋ฉ‹์ง„ ํŠน์ง•์€ ๋ฐ”๋กœ ๋™์ ์œผ๋กœ ํฌ๊ธฐ๋ฅผ ์กฐ์ ˆํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฑฐ์˜ˆ์š”. 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() ํ•จ์ˆ˜๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ์–ด์š”. ์šฉ๋Ÿ‰์€ ์Šฌ๋ผ์ด์Šค๊ฐ€ ์–ผ๋งˆ๋‚˜ ๋” ์„ฑ์žฅํ•  ์ˆ˜ ์žˆ๋Š”์ง€๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ์ง€ํ‘œ์˜ˆ์š”.

์Šฌ๋ผ์ด์Šค์˜ ๋‚ด๋ถ€ ๊ตฌ์กฐ ์Šฌ๋ผ์ด์Šค ๊ตฌ์กฐ ํฌ์ธํ„ฐ ๊ธธ์ด ์šฉ๋Ÿ‰ ๋ฐฐ์—ด (์‹ค์ œ ๋ฐ์ดํ„ฐ) ์š”์†Œ1 ์š”์†Œ2 ์š”์†Œ3 ์š”์†Œ4 ์š”์†Œ5

์ด ๊ทธ๋ฆผ์„ ๋ณด๋ฉด ์Šฌ๋ผ์ด์Šค์˜ ๊ตฌ์กฐ๊ฐ€ ์ข€ ๋” ๋ช…ํ™•ํ•ด์ง€์ฃ ? ํฌ์ธํ„ฐ๋Š” ์‹ค์ œ ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ๋Š” ๋ฐฐ์—ด์˜ ์‹œ์ž‘์ ์„ ๊ฐ€๋ฆฌํ‚ค๊ณ , ๊ธธ์ด๋Š” ํ˜„์žฌ ์‚ฌ์šฉ ์ค‘์ธ ์š”์†Œ์˜ ์ˆ˜, ์šฉ๋Ÿ‰์€ ์ „์ฒด ๋ฐฐ์—ด์˜ ํฌ๊ธฐ๋ฅผ ๋‚˜ํƒ€๋‚ด์š”. ๋งˆ์น˜ ์•„์ด์Šคํฌ๋ฆผ ์ฝ˜์„ ์ƒ๊ฐํ•ด๋ณด์„ธ์š”. ํฌ์ธํ„ฐ๋Š” ์•„์ด์Šคํฌ๋ฆผ์˜ ์‹œ์ž‘์ , ๊ธธ์ด๋Š” ํ˜„์žฌ ๋จน์€ ์–‘, ์šฉ๋Ÿ‰์€ ์ฝ˜์— ๋‹ด์„ ์ˆ˜ ์žˆ๋Š” ์ „์ฒด ์•„์ด์Šคํฌ๋ฆผ์˜ ์–‘์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ์–ด์š”! ๐Ÿฆ

์Šฌ๋ผ์ด์Šค์˜ ๋™์ž‘ ์›๋ฆฌ

์ด์ œ ์Šฌ๋ผ์ด์Šค์˜ ๊ตฌ์กฐ๋ฅผ ์•Œ์•˜์œผ๋‹ˆ, ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋Š”์ง€ ์ž์„ธํžˆ ์‚ดํŽด๋ณผ๊นŒ์š”?

์Šฌ๋ผ์ด์Šค ์ƒ์„ฑ

์Šฌ๋ผ์ด์Šค๋ฅผ ์ƒ์„ฑํ•  ๋•Œ, Go๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ ๋ฐฐ์—ด์„ ๋งŒ๋“ค๊ณ  ๊ทธ ๋ฐฐ์—ด์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ์Šฌ๋ผ์ด์Šค ๊ตฌ์กฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ด์š”.


fruits := []string{"์‚ฌ๊ณผ", "๋ฐ”๋‚˜๋‚˜", "์˜ค๋ Œ์ง€"}

์ด ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด, Go๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ด์š”:

  1. 3๊ฐœ์˜ ๋ฌธ์ž์—ด์„ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฐ์—ด์„ ๋ฉ”๋ชจ๋ฆฌ์— ์ƒ์„ฑ
  2. ์Šฌ๋ผ์ด์Šค ๊ตฌ์กฐ์ฒด ์ƒ์„ฑ (ํฌ์ธํ„ฐ๋Š” ๋ฐฐ์—ด์˜ ์‹œ์ž‘์ ์„ ๊ฐ€๋ฆฌํ‚ด)
  3. ๊ธธ์ด์™€ ์šฉ๋Ÿ‰์„ 3์œผ๋กœ ์„ค์ •

์Šฌ๋ผ์ด์Šค ํ™•์žฅ

์Šฌ๋ผ์ด์Šค์— ์ƒˆ๋กœ์šด ์š”์†Œ๋ฅผ ์ถ”๊ฐ€ํ•  ๋•Œ, Go๋Š” ํ˜„์žฌ ์šฉ๋Ÿ‰์„ ์ฒดํฌํ•ด์š”. ๋งŒ์•ฝ ํ˜„์žฌ ์šฉ๋Ÿ‰์œผ๋กœ ์ƒˆ ์š”์†Œ๋ฅผ ์ˆ˜์šฉํ•  ์ˆ˜ ์—†๋‹ค๋ฉด, ๋” ํฐ ๋ฐฐ์—ด์„ ์ƒˆ๋กœ ๋งŒ๋“ค๊ณ  ๊ธฐ์กด ๋ฐ์ดํ„ฐ๋ฅผ ๋ณต์‚ฌํ•œ ํ›„, ์Šฌ๋ผ์ด์Šค์˜ ํฌ์ธํ„ฐ๋ฅผ ์ƒˆ ๋ฐฐ์—ด๋กœ ๋ณ€๊ฒฝํ•ด์š”.


fruits = append(fruits, "ํ‚ค์œ„")

์ด ๊ณผ์ •์€ ๋งˆ์น˜ ์˜ท์žฅ์ด ๊ฝ‰ ์ฐจ์„œ ๋” ํฐ ์˜ท์žฅ์œผ๋กœ ์ด์‚ฌํ•˜๋Š” ๊ฒƒ๊ณผ ๋น„์Šทํ•ด์š”. ๋ชจ๋“  ์˜ท(๋ฐ์ดํ„ฐ)์„ ์ƒˆ ์˜ท์žฅ(์ƒˆ ๋ฐฐ์—ด)์œผ๋กœ ์˜ฎ๊ธฐ๊ณ , ์ฃผ์†Œ(ํฌ์ธํ„ฐ)๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๊ฑฐ์ฃ ! ๐Ÿงณ

๐Ÿ’ก Pro Tip: Go์˜ ์Šฌ๋ผ์ด์Šค ํ™•์žฅ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๋งค์šฐ ํšจ์œจ์ ์ด์—์š”. ์ƒˆ ๋ฐฐ์—ด์„ ๋งŒ๋“ค ๋•Œ, ๋ณดํ†ต ํ˜„์žฌ ์šฉ๋Ÿ‰์˜ 2๋ฐฐ ํฌ๊ธฐ๋กœ ๋งŒ๋“ค์–ด์š”. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์žฆ์€ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น์„ ํ”ผํ•  ์ˆ˜ ์žˆ์–ด ์„ฑ๋Šฅ์ด ํ–ฅ์ƒ๋ผ์š”!

์Šฌ๋ผ์ด์‹ฑ ์ž‘์—…

์Šฌ๋ผ์ด์‹ฑ์„ ํ•  ๋•Œ, ์ƒˆ๋กœ์šด ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น์€ ์ผ์–ด๋‚˜์ง€ ์•Š์•„์š”. ๋Œ€์‹ , ๊ธฐ์กด ๋ฐฐ์—ด์˜ ์ผ๋ถ€๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ƒˆ๋กœ์šด ์Šฌ๋ผ์ด์Šค ๊ตฌ์กฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋ผ์š”.


subSlice := fruits[1:3]

์ด ์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ด์š”:

  1. ์ƒˆ๋กœ์šด ์Šฌ๋ผ์ด์Šค ๊ตฌ์กฐ์ฒด ์ƒ์„ฑ
  2. ํฌ์ธํ„ฐ๋ฅผ fruits[1]์˜ ์ฃผ์†Œ๋กœ ์„ค์ •
  3. ๊ธธ์ด๋ฅผ 2๋กœ ์„ค์ • (3 - 1 = 2)
  4. ์šฉ๋Ÿ‰์„ ์›๋ณธ ์Šฌ๋ผ์ด์Šค์˜ ๋‚จ์€ ์šฉ๋Ÿ‰์œผ๋กœ ์„ค์ •

์ด๊ฒƒ์€ ๋งˆ์น˜ ์ฑ…์˜ ํŠน์ • ํŽ˜์ด์ง€์— ์ฑ…๊ฐˆํ”ผ๋ฅผ ๊ฝ‚๋Š” ๊ฒƒ๊ณผ ๋น„์Šทํ•ด์š”. ์ƒˆ ์ฑ…์„ ๋งŒ๋“œ๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ, ๊ธฐ์กด ์ฑ…์˜ ํŠน์ • ๋ถ€๋ถ„์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฑฐ์ฃ ! ๐Ÿ“š

์Šฌ๋ผ์ด์Šค์˜ ๋‚ด๋ถ€ ๊ตฌ์กฐ๊ฐ€ ์ค‘์š”ํ•œ ์ด์œ 

์Šฌ๋ผ์ด์Šค์˜ ๋‚ด๋ถ€ ๊ตฌ์กฐ๋ฅผ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์€ ๋‹จ์ˆœํžˆ ์ง€์‹์„ ์Œ“๋Š” ๊ฒƒ ์ด์ƒ์˜ ์˜๋ฏธ๊ฐ€ ์žˆ์–ด์š”. ์ด๋ฅผ ํ†ตํ•ด ์šฐ๋ฆฌ๋Š”:

  • ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋” ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์š”.
  • ์„ฑ๋Šฅ ์ตœ์ ํ™”๋ฅผ ํ•  ์ˆ˜ ์žˆ์–ด์š”.
  • ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๋ฒ„๊ทธ๋ฅผ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์–ด์š”.

์˜ˆ๋ฅผ ๋“ค์–ด, ํฐ ์Šฌ๋ผ์ด์Šค์˜ ์ž‘์€ ๋ถ€๋ถ„๋งŒ ํ•„์š”ํ•  ๋•Œ ์ „์ฒด๋ฅผ ๋ณต์‚ฌํ•˜๋Š” ๋Œ€์‹  ์Šฌ๋ผ์ด์‹ฑ์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์„ ํฌ๊ฒŒ ์ค„์ผ ์ˆ˜ ์žˆ์–ด์š”. ๋˜ํ•œ, 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์˜ ๋งต์€ ๋‚ด๋ถ€์ ์œผ๋กœ ํ•ด์‹œ ํ…Œ์ด๋ธ”๋กœ ๊ตฌํ˜„๋˜์–ด ์žˆ์–ด์š”. ํ•ด์‹œ ํ…Œ์ด๋ธ”์€ ํ‚ค๋ฅผ ํŠน์ • ๊ฐ’(ํ•ด์‹œ)์œผ๋กœ ๋ณ€ํ™˜ํ•œ ํ›„, ๊ทธ ๊ฐ’์„ ์ธ๋ฑ์Šค๋กœ ์‚ฌ์šฉํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ์ž๋ฃŒ๊ตฌ์กฐ์˜ˆ์š”.

ํ•ด์‹œ ํ…Œ์ด๋ธ” ๊ตฌ์กฐ ํ•ด์‹œ ํ…Œ์ด๋ธ” 0 1 2 3 4 5 6 Key1 Key2 Key3

ํ•ด์‹œ ํ•จ์ˆ˜๋Š” ํ‚ค๋ฅผ ๊ณ ์œ ํ•œ ์ˆซ์ž๋กœ ๋ณ€ํ™˜ํ•ด์š”. ์ด ์ˆซ์ž๋ฅผ ์‚ฌ์šฉํ•ด ๊ฐ’์„ ์ €์žฅํ•˜๊ฑฐ๋‚˜ ๊ฒ€์ƒ‰ํ•˜๋Š” ๊ฑฐ์ฃ . ์ด ๋ฐฉ์‹ ๋•๋ถ„์— ๋งต์€ ๋งค์šฐ ๋น ๋ฅธ ๊ฒ€์ƒ‰ ์†๋„๋ฅผ ์ž๋ž‘ํ•ด์š”!

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 ๋Ÿฐํƒ€์ž„์€ ์ž๋™์œผ๋กœ ๋งต์„ ์žฌํ• ๋‹นํ•ด์š”. ์ด ๊ณผ์ •์€ ๋‹ค์Œ๊ณผ ๊ฐ™์•„์š”:

  1. ์ƒˆ๋กœ์šด, ๋” ํฐ ํ•ด์‹œ ํ…Œ์ด๋ธ”์„ ์ƒ์„ฑํ•ด์š”.
  2. ๋ชจ๋“  ๊ธฐ์กด ํ‚ค-๊ฐ’ ์Œ์„ ์ƒˆ ํ…Œ์ด๋ธ”๋กœ ๋ณต์‚ฌํ•ด์š”.
  3. ๊ธฐ์กด ํ…Œ์ด๋ธ”์„ ์‚ญ์ œํ•˜๊ณ  ์ƒˆ ํ…Œ์ด๋ธ”์„ ์‚ฌ์šฉํ•ด์š”.

์ด ๊ณผ์ •์€ ์ž๋™์œผ๋กœ ์ผ์–ด๋‚˜์ง€๋งŒ, ๋Œ€๋Ÿ‰์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃฐ ๋•Œ๋Š” ์„ฑ๋Šฅ์— ์˜ํ–ฅ์„ ์ค„ ์ˆ˜ ์žˆ์–ด์š”. ๊ทธ๋ž˜์„œ ๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด ์ดˆ๊ธฐ ํฌ๊ธฐ๋ฅผ ์ ์ ˆํžˆ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์•„์š”.

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)
    }
}

์ด ํ”„๋กœ๊ทธ๋žจ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ด์š”:

  1. ํ…์ŠคํŠธ ํŒŒ์ผ์„ ์ฝ์–ด๋“ค์ž…๋‹ˆ๋‹ค.
  2. ๊ฐ ๋‹จ์–ด์˜ ๋นˆ๋„์ˆ˜๋ฅผ ๋งต์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
  3. ๋นˆ๋„์ˆ˜๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋‹จ์–ด๋“ค์„ ์ •๋ ฌํ•ฉ๋‹ˆ๋‹ค.
  4. ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉ๋œ ์ƒ์œ„ 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๋กœ ์‹คํ˜„์‹œ์ผœ ๋ณด์„ธ์š”. ํ™”์ดํŒ…! ๐Ÿš€