Go์ธ์ด์๋ C, C++ ์ฒ๋ผ ํฌ์ธํฐ๊ฐ ์๋ค. ํฌ์ธํฐ๋ ๋ณ์์ด๋ค. ํ์ง๋ง ํน๋ณํ ๋ณ์์ด๋ค.
- ํฌ์ธํฐ๋ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ง์ ์ ์ฅํ๊ธฐ ์ํด ๋ง๋ค์ด์ง ํน๋ณํ ๋ณ์์ด๋ค.
- ํฌ์ธํฐ ๋ณ์์๋ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ง ์ ์ฅ๋๋ค.
// ํฌ์ธํฐ ๋ณ์๋ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ง ์ ์ฅ ๊ฐ๋ฅ
var pp *int
pp = 1 // ํฌ์ธํฐ ๋ณ์์ ์ ์ ํ ๋น ์๋
fmt.Println(pp) // cannot use 1 (type int) as type *int in assignmentpp๋ ํฌ์ธํฐ๋ณ์ ์ด๊ธฐ์ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ง ํ ๋น ๊ฐ๋ฅํ๋ค. pp = 1 ์ ํตํด ์ ์๋ฅผ ํ ๋นํ๋ ค๊ณ ํ์์ผ๋ ์ค๋ฅ๋ฅผ ๋ง๋๊ฒ ๋๋ค.
- ์์ ์ด ์ฌ์ฉํ๊ณ ์ ํ๋ ๋ฉ๋ชจ๋ฆฌ์ '์ฃผ์๊ฐ'์ ํฌ์ธํฐ ๋ณ์๋ฅผ ํตํด ์ ์ฅํ ์ ์๋ค.
ํฌ์ธํฐ๋ ๋ฉ๋ชจ๋ฆฌ์ ์ฃผ์(์์น)๋ฅผ ๋ด๊ณ ์๋ค.
- ํฌ์ธํฐ ๊ฐ == ๋ณ์์ ์ฃผ์
// ์ฃผ์์ ์
0xc000096040-
ํฌ์ธํฐ๋ฅผ ์ ์ดํดํ๊ธฐ ์ํด์๋ ๋ฉ๋ชจ๋ฆฌ๊ฐ ๊ตฌ์ฑ๋๊ณ ๊ด๋ฆฌ๋๋ ๋ฐฉ๋ฒ์ ์์์ผ ํ๋ค.
- Static, Global
- Automatic, Local
- Dynamic
- Scope
- Lifetime
๋ฉ๋ชจ๋ฆฌ์ ์ข ๋ฅ๋ฅผ ์ดํดํ๋ ๊ฒ์ด ํฌ์ธํฐ์ ๋์์ ์ดํดํ๋๋ฐ ๋์์ด ๋๋ค.
-
๋ชจ๋ ๊ฐ์ด ์ฃผ์๋ฅผ ๊ฐ๊ณ ์์ง๋ ์๋๋ผ๋ ๋ชจ๋ ๋ณ์์๋ ์ฃผ์๊ฐ ์๋ค.
- Struct์ field, Array์ element๋ ๋ณ์์ด๊ธฐ ๋๋ฌธ์ ์ฃผ์๋ฅผ ๊ฐ๊ณ ์๋ค.
-
์ฐธ์กฐ Reference
&<pointerName>- &์ฐ์ฐ์๋ ๋จํญ ์ฐ์ฐ์์ด๋ฉฐ ๋ณ์๋ง์ ํผ์ฐ์ฐ์(operand)๋ก ์ฌ์ฉํ๋ค.
-
์ญ์ฐธ์กฐ Dereference
*<pointerName>- ํฌ์ธํฐ๋ณ์์ ๊ฐ์ ๋์ ํ ๋ ์ฌ์ฉ
- ํฌ์ธํฐ๋ณ์์ ๊ฐ์ ๊ฐ์ ธ์ฌ ๋ ์ฌ์ฉ
-
Pointer์ ์ ๋ก๊ฐ์ ์ด๋ Type์ด๋์ง
nil์ด๋ค.- ํฌ์ธํฐ ๋ณ์๋ฅผ ์ ์ธํ๋ฉด nil๋ก ์ด๊ธฐํ ๋๋ค.
- nil pointer์ ์๋ฌด ์ฃผ์๋ ์ฐธ์กฐํ๊ณ ์์ง ์์ ํฌ์ธํฐ๋ฅผ ๋งํ๋ค.
- ํฌ์ธํฐ ๋ณ์
p๊ฐ ์๊ณp != nil์ดtrue๋ผ๋ ๊ฒ์ p๊ฐ ์ด๋ฏธ ํน์ ๋ณ์๋ฅผ ๊ฐ๋ฆฌํค๊ณ ์๋ค๋ ๊ฒ์ ์๋ฏธ.
- ํฌ์ธํฐ ๋ณ์
-
ํฌ์ธํฐ ์ฐ์ฐ ๋ถ๊ฐ
- Go์ธ์ด์์๋ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ ์ฐ์ฐํ์ฌ ์ง์ ๋ค๋ฃฐ ์ ์๋ค.
-
Pointer ๋ผ๋ฆฌ๋ ๋น๊ตํ ์ ์๋ค.
- ๋น๊ต์ฐ์ฐ์(
==) ๋ฅผ ์ฌ์ฉํ๋ค. - ์ฐธ์ธ ๊ฒฝ์ฐ
๊ทธ ์ธ์๋ ๋ชจ๋ false- ๋ ํฌ์ธํฐ๊ฐ ๋์ผํ ๋ณ์๋ฅผ ๊ฐ๋ฆฌํด.
- ๋ ํฌ์ธํฐ๊ฐ ์ ๋ก๊ฐ์ธ nil์ ๊ฐ์ง.
- ๋น๊ต์ฐ์ฐ์(
-
*(Asterisk)๋ฅผ ์๋ฃํ ์์ ๋ถ์ธ๋ค.- C, C++ ์ธ ๊ฒฝ์ฐ
*๋ ์๋ฃํ ๋ค์ ์จ๋ค.
- C, C++ ์ธ ๊ฒฝ์ฐ
-
new()ํจ์๋ฅผ ํตํด ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํ๋ค.new()ํจ์๋ ์ง์ ํ ์๋ฃํ์ ํฌ๊ฒ์ ๋ง๋ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ํ ๋นํด์ค๋ค.
-
Garbage Collection ์ง์.
- Go์ธ์ด๋ ๊ฐ๋น์ง ์ปฌ๋ ์
์ ์ง์ํด์ค๋ค. ๊ทธ๋ก์ธํด ๋ฉ๋ชจ๋ฆฌ ํด์ ๋ ์ ๊ฒฝ์ฐ์ง ์๊ณ ๋ฉ๋ชจ๋ฆฌ ํ ๋น์๋ง ์ ๊ฒฝ์ฐ๋ฉด ๋๋ค.
- C/C++ ๊ฐ์ ๊ฒฝ์ฐ ํ๋ก๊ทธ๋๋จธ๊ฐ ์ง์
free()/delete()ํจ์๋ฅผ ํตํด ๋ฉ๋ชจ๋ฆฌ ํด์ ๋ฅผ ํด์ฃผ์ด์ผ ํ๋ค.
- C/C++ ๊ฐ์ ๊ฒฝ์ฐ ํ๋ก๊ทธ๋๋จธ๊ฐ ์ง์
- Go์ธ์ด๋ ๊ฐ๋น์ง ์ปฌ๋ ์
์ ์ง์ํด์ค๋ค. ๊ทธ๋ก์ธํด ๋ฉ๋ชจ๋ฆฌ ํด์ ๋ ์ ๊ฒฝ์ฐ์ง ์๊ณ ๋ฉ๋ชจ๋ฆฌ ํ ๋น์๋ง ์ ๊ฒฝ์ฐ๋ฉด ๋๋ค.
Syntax
- ํฌ์ธํฐ ๋ณ์ ์ ์ธ
var <pointerName> *Type
var p *int
fmt.Println("p", p) // <nil>
fmt.Println("Type of p : ", reflect.TypeOf(p)) // *intp๋ผ๋ ํฌ์ธํฐ๋ณ์๋ฅผ ์ ์ธ๋ง ํด ์ฃผ์๊ธฐ ๋๋ฌธ์ Go ์ปดํ์ผ๋ฌ๊ฐ ํด๋น ๊ฐ์ nil ๋ก ์ค์ ํด ์ฃผ์๋ค.
-
C์ธ์ด์ NULL ๊ฐ์ด Go์ธ์ด์์๋
nil์ด๋ค.- C์์ NULL์ ์ ์ 0์ด์ง๋ง Go์์์
nil์ ์ซ์ 0์ด ์๋๋ค.
์ฆ,fmt.Println(nil == 0)์ compiler error๋ฅผ ๋ธ๋ค.
- C์์ NULL์ ์ ์ 0์ด์ง๋ง Go์์์
-
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) // 0xc000096040p1์ ์ ์ธ๋ง ํ ํฌ์ธํฐ๋ณ์ ์ด๊ธฐ์ ์ด๊ธฐ๊ฐ์ผ๋ก nil ์ด ํ ๋น๋ฌ๋ค.
p2๋ new() ํจ์๋ฅผ ํตํด ์ ์ธ๊ณผ ๋์์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋น. ๋ฉ๋ชจ๋ฆฌ ๊ฐ์ผ๋ก 0xc000096038 ์ด ํ ๋น๋์๋ค.
๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ ์์คํ
๋ง๋ค ๋ค๋ฉฐ ์ปดํ์ผ ํ ๋ ๋ง๋ค ๋ฌ๋ผ์ง๋ค.
-
dereference | ์ญ์ฐธ์กฐ
์ญ์ฐธ์กฐ๋ฅผ ์ฌ์ฉํ์ฌ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์์ ๊ฐ์ ๋์ ํ๊ฑฐ๋ ๊ฐ์ ธ์ฌ ์ ์๋ค.
*<pointerName>
*<pointerName> = valuesvar 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
