Pointers

Go์˜ pointer์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์•„์š”

Go๋Š” ๋†’์€ ์ˆ˜์ค€์˜ code๋กœ low-level programming ์„ ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ค€๋‹ค

๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋ฅผ ํ™•์ธํ•˜๊ณ  ํ•ด๋‹น ์ฃผ์†Œ์— ์ ‘๊ทผ ํ•˜๊ธฐ

: ๊ฐ’์ด ๋ณต์‚ฌ ๋˜๋Š” ๊ฒƒ์„ ์›์น˜ ์•Š์„ ๋•Œ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค

ex)

package main

import "fmt"

func main() {
 a := 2
 b := a
 a = 10
  fmt.Println(a, b) // -> 10 2
}
  • ์œ„์˜ ์˜ˆ์‹œ์—์„œ ๊ฐ’์ด ๋ณต์‚ฌ๋˜๋Š” ๊ฒƒ์„ ํ™•์ธ ํ•  ์ˆ˜ ์žˆ๋‹ค

    • ์ฆ‰, a์˜ ๊ฐ’์„ update ํ•ด๋„ b์˜ ๊ฐ’์€ ๋ณ€ํ•˜์ง€ ์•Š๋Š”๋‹ค

ํ•˜์ง€๋งŒ ๊ฐ’์„ ๋ณต์‚ฌํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ, ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋ฅผ ์›ํ•  ๋•Œ์—๋Š” ์•„๋ž˜์˜ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค

& operator

: & ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ memory์˜ ์ฃผ์†Œ๋ฅผ ์•Œ์•„๋‚ผ ์ˆ˜ ์žˆ๋‹ค

package main

import "fmt"

func main() {
 a := 2
 b := a
 a = 10
  fmt.Println(&a, &b) //-> 0xc0000160b0 0xc0000160b8
}

& operator๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ์— ์ ‘๊ทผํ•˜๊ธฐ

package main

import "fmt"

func main() {
 a := 2
 b := &a
 a = 10
 fmt.Println(&a, b) // -> 0xc0000b4008 0xc0000b4008
}
  • ์—ฌ๊ธฐ์„œ b := &a ๋ฅผ ํ•จ์œผ๋กœ์จ b๋Š” a์˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋ณด๊ณ ์žˆ๊ฒŒ ๋œ๋‹ค

    • ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ์œ„์™€ ๊ฐ™์ด ๊ฐ™์€ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๊ฐ€ ์ถœ๋ ฅ๋œ๋‹ค

  • b๋ฅผ ๋ฐ”๋กœ pointer ๋ผ๊ณ  ํ•œ๋‹ค

* operator

: ***** ์™€ ์ฃผ์†Œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•ด๋‹น ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ์˜๊ฐ’์„ ์‚ดํŽด๋ณผ ์ˆ˜ ์žˆ๋‹ค

package main

import "fmt"

func main() {
 a := 2
 // get memory address
 b := &a
 a = 10
 fmt.Println(a, *b) // -> 10 10
}

  • ์•„์ฃผ ๋ฌด๊ฑฐ์šด data structure ๋‹ค๋ฃฐ ๋•Œ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅ๋œ ์ฃผ์†Œ๋ฅผ ํ™œ์šฉํ•˜๋Š” ๊ฒƒ์ด ๊ณ„์†ํ•ด์„œ ๋ณต์‚ฌ๋ณธ์„ ๋งŒ๋“ค์ง€ ์•Š์œผ๋ฏ€๋กœ ํšจ์œจ์ ์ด๋‹ค

    • ์ด๋ ‡๊ฒŒ pointer๋ฅผ ํ™œ์šฉํ•จ์œผ๋กœ์จ program์„ ๋น ๋ฅด๊ฒŒ ๋™์ž‘ํ•˜๋„๋ก ํ•  ์ˆ˜ ์žˆ๋‹ค!

pointer๋ฅผ ํ†ตํ•ด ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๊ธฐ

package main

import (
 "fmt"
)

func main() {
 a := 2
 // get memory address
 b := &a
 a = 10

 // change object from address
 *b = 20
 fmt.Println(a, *b)
}
  • a์˜ ์ฃผ์†Œ์™€ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š” pointer b๋ฅผ ์ด์šฉํ•ด์„œ a์˜ ๊ฐ’์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค

Last updated

Was this helpful?