๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

Language/Go

[Go] Slice, Pointer, Struct ์ •๋ฆฌ

Array vs Slice

Array

  • Python, JS์™€ ๋‹ฌ๋ฆฌ Golang์˜ array๋Š” ์ •ํ•ด์ง„ ๊ธธ์ด๊ฐ€ ์žˆ๋‹ค.
// Array
foods := [3]string{"kimchi", "pizza", "pasta"}

for _, food :=range foods {
    fmt.Println(food)
}
// ๋˜๋Š”
for i := 0; i <len(foods); i++ {
    fmt.Println(foods[i])
}

> kimchi
> pizza
> pasta

Slice

  • slice๋Š” ๊ฐ€๋ณ€ ๊ธธ์ด์˜ ๋ฐฐ์—ด์ด๋‹ค. ๋Œ€๊ด„ํ˜ธ ์•ˆ์˜ ์ˆซ์ž๋ฅผ ์ง€์šฐ๋ฉด slice๊ฐ€ ๋œ๋‹ค.
  • slice์— ์š”์†Œ๋ฅผ ์ถ”๊ฐ€ํ•  ๋•Œ๋Š” append ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ๋ณต์‚ฌ๋ณธ์œผ๋กœ ์›๋ณธ slice๋ฅผ ์—…๋ฐ์ดํŠธ ํ•ด์ค˜์•ผ ํ•œ๋‹ค.
// Slice
foods := []string{"kimchi", "pizza", "pasta"}
fmt.Printf("%v\n", foods)
> kimchi
> pizza
> pasta

foods = append(foods, "icecream") // ์š”์†Œ ์ถ”๊ฐ€
fmt.Printf("%v\n", foods)

> kimchi
> pizza
> pasta
> icecream

Pointer

  • Go๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ์ปดํ“จํ„ฐ ๋ฉ”๋ชจ๋ฆฌ์— ์ ‘๊ทผํ•˜๊ฒŒ ํ•ด์ค€๋‹ค.
    • ์•„๋ž˜์™€ ๊ฐ™์€ ๊ฒฝ์šฐ a์˜ ๊ฐ’์„ ๋ณ€๊ฒฝํ•ด๋„ a์˜ ๊ฐ’์„ ๋ณต์‚ฌํ•œ b์—๋Š” ์˜ํ–ฅ์ด ๊ฐ€์ง€ ์•Š๋Š”๋‹ค.
    • JS์˜ ์›์‹œ์ž๋ฃŒํ˜•๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ, b์—๋Š” a์˜ ๊ฐ’์„ ๋ณต์‚ฌํ•˜์—ฌ ๋…๋ฆฝ์ ์ธ ๋ณ€์ˆ˜๋กœ ์ƒ์„ฑ๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
a := 2
b := a
a = 12
fmt.Println(b) // 2
  • ๋ณ€์ˆ˜ ์•ž์— (&)๋ฅผ ๋ถ™์ด๋ฉด ๋ณ€์ˆ˜์˜ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค.
    • ์•„๋ž˜์˜ ์ฝ”๋“œ์—์„œ b๋Š” a์˜ ์œ„์น˜๋ฅผ ๋‹ด์€ ํฌ์ธํ„ฐ ๋ณ€์ˆ˜๊ฐ€ ๋œ๋‹ค. ์ด๋Š” ๋ณต์‚ฌ๊ฐ€ ์•„๋‹ˆ๋ผ ์ฐธ์กฐ ๋‹ค!
    • ์ฆ‰, a๋ฅผ ์–ธ์ œ ์—…๋ฐ์ดํŠธํ•˜๋“  b์—์„œ a์˜ ๊ฐ’์„ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.
    • ํฌ์ธํ„ฐ ๋ณ€์ˆ˜์— ์ €์žฅ๋œ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ณณ์˜ ๊ฐ’์„ ์–ป์œผ๋ ค๋ฉด ํฌ์ธํ„ฐ ๋ณ€์ˆ˜ ์•ž์— (*)์„ ๋ถ™์ด๋ฉด ๋œ๋‹ค.
a := 2
b := &a
a = 50
fmt.Println(b, &a)// 0x140000a6018 0x140000a6018
fmt.Println(*b)// 50

Struct & Receiver

  • ๋‹ค๋ฅธ ์–ธ์–ด์—์„œ์˜ class์™€ method๋ฅผ Golang์—์„œ๋Š” struct์™€ receiver ํ•จ์ˆ˜๋กœ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.
  • ํ•จ์ˆ˜ ์ด๋ฆ„ ์•ž์— struct ์ด๋ฆ„์„ ๋ช…์‹œํ•ด์ฃผ๋ฉด, ์ด๋Š” ํ•ด๋‹น struct ํƒ€์ž…์˜ ๋ณ€์ˆ˜์—๋งŒ ์œ ํšจํ•œ receiver ํ•จ์ˆ˜๊ฐ€ ๋œ๋‹ค.
    • NodeJS์—์„œ๋Š” export๋ฅผ ๋ฐ˜๋“œ์‹œ ๋ช…์‹œํ•ด์ค˜์•ผ ํ•˜๋Š” ๊ฒƒ๊ณผ ๋‹ฌ๋ฆฌ, Go์—์„œ๋Š” ๋Œ€๋ฌธ์ž๋กœ ์‹œ์ž‘ํ•˜๋„๋ก ์ž‘์„ฑํ•˜๋ฉด ์ž๋™์œผ๋กœ Export๊ฐ€ ๋œ๋‹ค.
    • ์ด ์ ์„ ํ™œ์šฉํ•˜์—ฌ struct์˜ ํ•„๋“œ๋Š” ์†Œ๋ฌธ์ž๋กœ ์ž‘์„ฑํ•ด์„œ ์™ธ๋ถ€์—์„œ ์ง์ ‘ ์ˆ˜์ •ํ•˜์ง€ ๋ชปํ•˜๋„๋ก ํ•˜๊ณ , receiver ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ์ ‘๊ทผํ•˜๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. (= ์บก์Аํ™”)
  • ์ฃผ์˜ํ•  ์ ์€ receiver ํ•จ์ˆ˜์— ์ˆ˜์ •์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ receiver ํฌ์ธํ„ฐ ํ•จ์ˆ˜๋กœ ์„ค์ •ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.
    • struct ํƒ€์ž… ์•ž์— (*)์„ ๋ถ™์ด์ง€ ์•Š์œผ๋ฉด struct๋ฅผ ๋ณต์‚ฌํ•œ ๊ฐ’์— ๋Œ€ํ•ด receiver ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋œ๋‹ค.

Value Receiver

  • receiver ํ•จ์ˆ˜์˜ ํƒ€์ž…์ด struct์˜ ๊ฐ’์ธ ๊ฒฝ์šฐ, struct์˜ ๊ฐ’์„ ๋ณต์‚ฌํ•˜์—ฌ ํ•จ์ˆ˜ ๋‚ด์—์„œ ์‚ฌ์šฉํ•œ๋‹ค.
  • ํ•จ์ˆ˜ ๋‚ด์—์„œ struct์˜ ํ•„๋“œ๋ฅผ ๋ณ€๊ฒฝํ•˜๋”๋ผ๋„ ์›๋ณธ struct์—๋Š” ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š๋Š”๋‹ค.
  • ๋”ฐ๋ผ์„œ, struct์˜ ํ•„๋“œ ์ˆ˜์ •์ด ํ•„์š”ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ์— ์‚ฌ์šฉํ•œ๋‹ค.

Pointer Receiver

  • receiver ํ•จ์ˆ˜์˜ ํƒ€์ž…์ด struct์˜ ํฌ์ธํ„ฐ์ธ ๊ฒฝ์šฐ, struct์˜ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋ฅผ ํ†ตํ•ด ์›๋ณธ struct์— ์ง์ ‘ ์ ‘๊ทผํ•œ๋‹ค.
  • ํ•จ์ˆ˜ ๋‚ด์—์„œ struct์˜ ํ•„๋“œ๋ฅผ ๋ณ€๊ฒฝํ•˜๋ฉด ์›๋ณธ struct๊ฐ€ ์ˆ˜์ •๋œ๋‹ค.
  • ๋”ฐ๋ผ์„œ, struct์˜ ํ•„๋“œ ์ˆ˜์ •์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์‚ฌ์šฉํ•œ๋‹ค.
// struct
type Personstruct {
    name string
    age int
}

// value receiver function
func (person Person) SayHello() {
    fmt.Printf("Hello My name is %s and I'm %d", person.name, person.age)
}

// pointer receiver function
func (person *Person) SetDetails(name string, age int) {
    person.name = name
    person.age = age
}

func main() {
    person := Person{}
    person.SayHello()
    person.SetDetails("confident-dev", 12);
    fmt.Println(person)// confident-dev  12
}

์ฐธ๊ณ 

'Language > Go' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[Go] Go ํ™˜๊ฒฝ์„ค์ •  (0) 2025.04.24