Skip to content

Latest commit

ย 

History

History
143 lines (117 loc) ยท 6.29 KB

File metadata and controls

143 lines (117 loc) ยท 6.29 KB

Pointer

pointer

Go์–ธ์–ด์—๋Š” C, C++ ์ฒ˜๋Ÿผ ํฌ์ธํ„ฐ๊ฐ€ ์žˆ๋‹ค. ํฌ์ธํ„ฐ๋Š” ๋ณ€์ˆ˜์ด๋‹ค. ํ•˜์ง€๋งŒ ํŠน๋ณ„ํ•œ ๋ณ€์ˆ˜์ด๋‹ค.

  • ํฌ์ธํ„ฐ๋Š” ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋งŒ์„ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด ๋งŒ๋“ค์–ด์ง„ ํŠน๋ณ„ํ•œ ๋ณ€์ˆ˜์ด๋‹ค.
  • ํฌ์ธํ„ฐ ๋ณ€์ˆ˜์—๋Š” ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋งŒ ์ €์žฅ๋œ๋‹ค.
// ํฌ์ธํ„ฐ ๋ณ€์ˆ˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋งŒ ์ €์žฅ ๊ฐ€๋Šฅ
  var pp *int
  pp = 1          // ํฌ์ธํ„ฐ ๋ณ€์ˆ˜์— ์ •์ˆ˜ ํ• ๋‹น ์‹œ๋„
  fmt.Println(pp) // cannot use 1 (type int) as type *int in assignment

pp๋Š” ํฌ์ธํ„ฐ๋ณ€์ˆ˜ ์ด๊ธฐ์— ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋งŒ ํ• ๋‹น ๊ฐ€๋Šฅํ•˜๋‹ค. pp = 1 ์„ ํ†ตํ•ด ์ •์ˆ˜๋ฅผ ํ• ๋‹นํ•˜๋ ค๊ณ  ํ•˜์˜€์œผ๋‚˜ ์˜ค๋ฅ˜๋ฅผ ๋งŒ๋‚˜๊ฒŒ ๋œ๋‹ค.

  • ์ž์‹ ์ด ์‚ฌ์šฉํ•˜๊ณ ์ž ํ•œ๋Š” ๋ฉ”๋ชจ๋ฆฌ์˜ '์ฃผ์†Œ๊ฐ’'์„ ํฌ์ธํ„ฐ ๋ณ€์ˆ˜๋ฅผ ํ†ตํ•ด ์ €์žฅํ•  ์ˆ˜ ์žˆ๋‹ค.

ํฌ์ธํ„ฐ๋Š” ๋ฉ”๋ชจ๋ฆฌ์˜ ์ฃผ์†Œ(์œ„์น˜)๋ฅผ ๋‹ด๊ณ  ์žˆ๋‹ค.

  • ํฌ์ธํ„ฐ ๊ฐ’ == ๋ณ€์ˆ˜์˜ ์ฃผ์†Œ
// ์ฃผ์†Œ์˜ ์˜ˆ
0xc000096040
  • ํฌ์ธํ„ฐ๋ฅผ ์ž˜ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๊ตฌ์„ฑ๋˜๊ณ  ๊ด€๋ฆฌ๋˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„์•ผ ํ•œ๋‹ค.

    • Static, Global
    • Automatic, Local
    • Dynamic
    • Scope
    • Lifetime
      ๋ฉ”๋ชจ๋ฆฌ์˜ ์ข…๋ฅ˜๋ฅผ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์ด ํฌ์ธํ„ฐ์˜ ๋™์ž‘์„ ์ดํ•ดํ•˜๋Š”๋ฐ ๋„์›€์ด ๋œ๋‹ค.
  • ๋ชจ๋“  ๊ฐ’์ด ์ฃผ์†Œ๋ฅผ ๊ฐ–๊ณ ์žˆ์ง€๋Š” ์•Š๋”๋ผ๋„ ๋ชจ๋“  ๋ณ€์ˆ˜์—๋Š” ์ฃผ์†Œ๊ฐ€ ์žˆ๋‹ค.

    • Struct์˜ field, Array์˜ element๋„ ๋ณ€์ˆ˜์ด๊ธฐ ๋•Œ๋ฌธ์— ์ฃผ์†Œ๋ฅผ ๊ฐ–๊ณ  ์žˆ๋‹ค.

Pointer์˜ ํŠน์ง•

  • ์ฐธ์กฐ Reference
    &<pointerName>

    • &์—ฐ์‚ฐ์ž๋Š” ๋‹จํ•ญ ์—ฐ์‚ฐ์ž์ด๋ฉฐ ๋ณ€์ˆ˜๋งŒ์„ ํ”ผ์—ฐ์‚ฐ์ž(operand)๋กœ ์‚ฌ์šฉํ•œ๋‹ค.
  • ์—ญ์ฐธ์กฐ Dereference
    *<pointerName>

    • ํฌ์ธํ„ฐ๋ณ€์ˆ˜์— ๊ฐ’์„ ๋Œ€์ž…ํ•  ๋•Œ ์‚ฌ์šฉ
    • ํฌ์ธํ„ฐ๋ณ€์ˆ˜์˜ ๊ฐ’์„ ๊ฐ€์ ธ์˜ฌ ๋•Œ ์‚ฌ์šฉ
  • Pointer์˜ ์ œ๋กœ๊ฐ’์€ ์–ด๋А Type์ด๋˜์ง€ nil ์ด๋‹ค.

    • ํฌ์ธํ„ฐ ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•˜๋ฉด nil๋กœ ์ดˆ๊ธฐํ™” ๋œ๋‹ค.
    • nil pointer์€ ์•„๋ฌด ์ฃผ์†Œ๋„ ์ฐธ์กฐํ•˜๊ณ  ์žˆ์ง€ ์•Š์€ ํฌ์ธํ„ฐ๋ฅผ ๋งํ•œ๋‹ค.
      • ํฌ์ธํ„ฐ ๋ณ€์ˆ˜ p ๊ฐ€ ์žˆ๊ณ  p != nil ์ด true ๋ผ๋Š” ๊ฒƒ์€ p๊ฐ€ ์ด๋ฏธ ํŠน์ • ๋ณ€์ˆ˜๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธ.
  • ํฌ์ธํ„ฐ ์—ฐ์‚ฐ ๋ถˆ๊ฐ€

    • Go์–ธ์–ด์—์„œ๋Š” ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋ฅผ ์—ฐ์‚ฐํ•˜์—ฌ ์ง์ ‘ ๋‹ค๋ฃฐ ์ˆ˜ ์—†๋‹ค.
  • Pointer ๋ผ๋ฆฌ๋Š” ๋น„๊ตํ•  ์ˆ˜ ์žˆ๋‹ค.

    • ๋น„๊ต์—ฐ์‚ฐ์ž(==) ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
    • ์ฐธ์ธ ๊ฒฝ์šฐ
      ๊ทธ ์™ธ์—๋Š” ๋ชจ๋‘ false
      • ๋‘ ํฌ์ธํ„ฐ๊ฐ€ ๋™์ผํ•œ ๋ณ€์ˆ˜๋ฅผ ๊ฐ€๋ฆฌํ‚ด.
      • ๋‘ ํฌ์ธํ„ฐ๊ฐ€ ์ œ๋กœ๊ฐ’์ธ nil์„ ๊ฐ€์ง.
  • * (Asterisk)๋ฅผ ์ž๋ฃŒํ˜• ์•ž์— ๋ถ™์ธ๋‹ค.

    • C, C++ ์ธ ๊ฒฝ์šฐ * ๋Š” ์ž๋ฃŒํ˜• ๋’ค์— ์˜จ๋‹ค.
  • new() ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•œ๋‹ค.

    • new() ํ•จ์ˆ˜๋Š” ์ง€์ •ํ•œ ์ž๋ฃŒํ˜•์˜ ํฌ๊ฒŒ์— ๋งž๋Š” ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ํ• ๋‹นํ•ด์ค€๋‹ค.
  • Garbage Collection ์ง€์›.

    • Go์–ธ์–ด๋Š” ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์„ ์ง€์›ํ•ด์ค€๋‹ค. ๊ทธ๋กœ์ธํ•ด ๋ฉ”๋ชจ๋ฆฌ ํ•ด์ œ๋Š” ์‹ ๊ฒฝ์“ฐ์ง€ ์•Š๊ณ  ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น์—๋งŒ ์‹ ๊ฒฝ์“ฐ๋ฉด ๋œ๋‹ค.
      • C/C++ ๊ฐ™์€ ๊ฒฝ์šฐ ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ์ง์ ‘ free()/ delete() ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ๋ฉ”๋ชจ๋ฆฌ ํ•ด์ œ๋ฅผ ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.

Pointer expressions

Syntax

  • ํฌ์ธํ„ฐ ๋ณ€์ˆ˜ ์„ ์–ธ
    var <pointerName> *Type
var p *int                        
  fmt.Println("p", p)                            // <nil>
  fmt.Println("Type of p : ", reflect.TypeOf(p)) // *int

p๋ผ๋Š” ํฌ์ธํ„ฐ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธ๋งŒ ํ•ด ์ฃผ์—ˆ๊ธฐ ๋•Œ๋ฌธ์— Go ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ํ•ด๋‹น ๊ฐ’์„ nil ๋กœ ์„ค์ •ํ•ด ์ฃผ์—ˆ๋‹ค.

  • C์–ธ์–ด์˜ NULL ๊ฐ’์ด Go์–ธ์–ด์—์„œ๋Š” nil ์ด๋‹ค.

    • C์—์„œ NULL์€ ์ •์ˆ˜ 0์ด์ง€๋งŒ Go์—์„œ์˜ nil ์€ ์ˆซ์ž 0์ด ์•„๋‹ˆ๋‹ค.
      ์ฆ‰, fmt.Println(nil == 0)์€ compiler error๋ฅผ ๋‚ธ๋‹ค.
  • new() ํ•จ์ˆ˜
    var <pointerName> *Type = new(Type)
    var <pointerName> = new(Type)

var p1 *int
  var p2 *int = new(int)
var p3 = new(int)

  fmt.Println(p1) // <nil>
  fmt.Println(p2) // 0xc000096038
fmt.Println(p3) // 0xc000096040

p1์€ ์„ ์–ธ๋งŒ ํ•œ ํฌ์ธํ„ฐ๋ณ€์ˆ˜ ์ด๊ธฐ์— ์ดˆ๊ธฐ๊ฐ’์œผ๋กœ nil ์ด ํ• ๋‹น๋ฌ๋‹ค.
p2๋Š” new() ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ์„ ์–ธ๊ณผ ๋™์‹œ์— ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹น. ๋ฉ”๋ชจ๋ฆฌ ๊ฐ’์œผ๋กœ 0xc000096038 ์ด ํ• ๋‹น๋˜์—ˆ๋‹ค.
๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋Š” ์‹œ์Šคํ…œ๋งˆ๋‹ค ๋‹ค๋ฉฐ ์ปดํŒŒ์ผ ํ•  ๋•Œ ๋งˆ๋‹ค ๋‹ฌ๋ผ์ง„๋‹ค.

  • dereference | ์—ญ์ฐธ์กฐ
    ์—ญ์ฐธ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ์˜ ๊ฐ’์„ ๋Œ€์ž…ํ•˜๊ฑฐ๋‚˜ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋‹ค.
    *<pointerName>
    *<pointerName> = values

    var numPtr *int = new(int)
    fmt.Println(numPtr) // 0xc00009690
    //dereference
    *numPtr = 2020
    fmt.Println(*numPtr) // 2020
    • ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•  ๋•Œ * ๋ฅผ ๋ถ™์ด๋ฉด ํฌ์ธํ„ฐํ˜• ๋ณ€์ˆ˜๊ฐ€ ๋˜์ง€๋งŒ,
      ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ * ๋ฅผ ๋ถ™์ด๋ฉด ์—ญ์ฐธ์กฐ๊ฐ€ ๋œ๋‹ค.
  • reference | ์ฐธ์กฐ
    ์ผ๋ฐ˜ ๋ณ€์ˆ˜์— ์ฐธ์กฐ(&)๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํฌ์ธํ„ฐํ˜• ๋ณ€์ˆ˜์— ๋Œ€์ž…ํ•  ์ˆ˜ ์žˆ๋‹ค.

    // reference &
    var n int = 2020   // ์ผ๋ฐ˜ ๋ณ€์ˆ˜ n
    var nPtr *int = &n // ์ฐธ์กฐ๋กœ n ๋ณ€์ˆ˜์˜ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋ฅผ ๊ตฌํ•œ ํ›„, ํฌ์ธํ„ฐ ๋ณ€์ˆ˜ nPtr์— ๋Œ€์ž…
    fmt.Println(n)     // 2020
    fmt.Println(&n)    // 0xc000096048
    fmt.Println(nPtr)  // 0xc000096048

    ๋ณ€์ˆ˜ ์•ž์— & ๋ฅผ ๋ถ™์ด๋ฉด ํ•ด๋‹น ๋ณ€์ˆ˜์˜ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋ฅผ ๋œปํ•œ๋‹ค.
    ์ฆ‰, var nPtr *int = &n ๋Š” ์ผ๋ฐ˜๋ณ€์ˆ˜ n ์˜ ์ฃผ์†Œ ์ž์ฒด๋ฅผ ํฌ์ธํ„ฐ๋ณ€์ˆ˜ nPtr ์˜ ๊ฐ’์œผ๋กœ ํ• ๋‹นํ•ด ์ค€ ๊ฒƒ.

  • ํฌ์ธํ„ฐ ์ง์ ‘ ๋‹ค๋ฃจ๊ธฐ ๋ถˆ๊ฐ€
    Go์–ธ์–ด์˜ ํฌ์ธํ„ฐ๋Š” ์ง์ ‘ ๋‹ค๋ฃฐ ์ˆ˜ ์—†๋‹ค.

    • ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋ฅผ ์ง์ ‘ ๋Œ€์ž…ํ•  ์ˆ˜ ์—†์Œ.
    • ํฌ์ธํ„ฐ ์—ฐ์‚ฐ์„ ํ•  ์ˆ˜ ์—†์Œ
      // Go ์–ธ์–ด์—์„œ๋Š” Pointer์—ฐ์‚ฐ์„ ์ง€์›ํ•˜์ง€ ์•Š๋Š”๋‹ค.
      var numPtr4 *int = new(int)
      numPtr4++              // ์—ฐ์‚ฐ์‹œ๋„ --> invalid operation: numPtr4++ (non-numeric type *int)
      numPtr4 = 0xc0820062d0 // cannot use 826814784208 (type int) as type *int in assignment