Backend/๐Ÿฉต Go

[Go] Pointer ์‰ฝ๊ฒŒ ์ดํ•ดํ•ด๋ณด์ž

Hugehoo 2025. 1. 5. 00:48

 

๋ชฉ์ฐจ

- Pointer ๊ธฐ๋ณธ ๊ฐœ๋… ์žก๊ธฐ

- Pointer ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ 

- Go ๋Š” ์™œ ๊ตณ์ด ํฌ์ธํ„ฐ๋ฅผ ๋„์ž…ํ–ˆ์„๊นŒ?

- ๋ฒˆ์™ธ) ์ž๋ฐ”์˜ ํฌ์ธํ„ฐ๋Š”?

 

Pointer ๊ธฐ๋ณธ ๊ฐœ๋… ์žก๊ธฐ

๊ทธ๋ž˜์„œ ํฌ์ธํ„ฐ๊ฐ€ ๋ฌด์—‡์ผ๊นŒ? ํฌ์ธํ„ฐ๋ž€ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋ฅผ ์ €์žฅํ•˜๋Š” ํŠน๋ณ„ํ•œ ๋ณ€์ˆ˜๋ฅผ ์˜๋ฏธํ•œ๋‹ค. ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ?? ์ง๊ด€์ ์œผ๋กœ ์ดํ•ด๋˜์ง€ ์•Š๋Š” ๋ฌธ์ž์™€ ์ˆซ์ž ๊ฐ’์„ ๋– ์˜ฌ๋ ธ๋‹ค๋ฉด ์ •๋‹ต์ด๋‹ค. ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋Š” ์ปดํ“จํ„ฐ์˜ RAM(Random Access Memory)์—์„œ ํŠน์ • ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ๋œ ๊ณ ์œ ํ•œ ์œ„์น˜๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ˆซ์ž๊ฐ’์„ ์˜๋ฏธํ•œ๋‹ค. ๊ฐœ๋ฐœ์ž๊ฐ€ ์–ด๋–ค ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•˜์—ฌ ๊ฐ’์„ ํ• ๋‹นํ•˜๋ฉด, ๋ณ€์ˆ˜ ๋ฐ์ดํ„ฐ๋Š” ๋ฉ”๋ชจ๋ฆฌ์˜ ํŠน์ • ์œ„์น˜์— ํ• ๋‹น๋œ ๊ฐ’์„ ์ €์žฅ๋œ๋‹ค. ์ฆ‰ ํ•ด๋‹น ๋ณ€์ˆ˜๋Š” ํŠน์ • ๋ฉ”๋ชจ๋ฆฌ ์œ„์น˜์— ํ• ๋‹น๋ฐ›์€ ๊ฐ’์„ ์ €์žฅํ•œ๋‹ค. ์ด ๋ฉ”๋ชจ๋ฆฌ ์œ„์น˜, ์ฆ‰ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฒƒ์ด ๋ฐ”๋กœ ํฌ์ธํ„ฐ๋‹ค! ์ฝ”๋“œ๋กœ ์ดํ•ดํ•ด๋ณด์ž.

/*
- ํฌ์ธํ„ฐ ์„ ์–ธ
- var ๋ณ€์ˆ˜๋ช… *ํƒ€์ž… <<< asterik ์„ ๋ถ™์—ฌ ํฌ์ธํ„ฐ ์„ ์–ธ
- int ํƒ€์ž…์˜ ํฌ์ธํ„ฐ
*/
var po *int

 

po ๋ณ€์ˆ˜๋Š” ํฌ์ธํ„ฐ๋กœ ์„ ์–ธ๋˜์—ˆ๋‹ค. ๊ทผ๋ฐ ์ด์ œ int ๋ฅผ ๊ณ๋“ค์ธ...

๋ฉ”๋ชจ๋ฆฌ ํŠน์ • ์œ„์น˜์— int ํƒ€์ž…์˜ ๊ฐ’์ด ์ €์žฅ๋˜๋ฉด po ๋กœ ํ•ด๋‹น int ํƒ€์ž… ๋ณ€์ˆ˜๊ฐ€ ์–ด๋–ค ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋ฅผ ์ฐธ์กฐํ•˜๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ์•„๋ž˜ ์˜ˆ์‹œ์—์„œ number ๋ผ๋Š” Int type ๋ณ€์ˆ˜๊ฐ€ ๋‚˜์˜จ๋‹ค. ์ด ๋ณ€์ˆ˜๊ฐ€ ์–ด๋–ค ๊ฐ’, ์˜ˆ๋ฅผ ๋“ค์–ด 100์„ ์ €์žฅํ•œ๋‹ค๊ณ  ํ•˜๋ฉด ๋ฉ”๋ชจ๋ฆฌ์˜ ์–ด๋–ค ์ฃผ์†Œ์— ์ด 100์ด๋ž€ ๊ฐ’์ด ์ €์žฅ๋  ๊ฒƒ์ด๋‹ค. ์šฐ๋ฆฌ ๊ฐœ๋ฐœ์ž๋“ค์€ 100์ด ์–ด๋–ค ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ์— ์ €์žฅ๋˜๋Š”์ง€ ์‹ ๊ฒฝ์“ฐ์ง€ ์•Š์•„๋„ ๋˜์ง€๋งŒ, ์ปดํŒŒ์ผ๋Ÿฌ ์ž…์žฅ์—์„œ๋Š” ์ด ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋ฅผ ์•Œ์•„์•ผ ํ•œ๋‹ค. ์ด ๋•Œ po ๋ผ๋Š” ํฌ์ธํ„ฐ ๋ณ€์ˆ˜๋ฅผ ํ†ตํ•ด number ๋ณ€์ˆ˜๊ฐ€ ์–ด๋Š ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋ฅผ ์ฐธ์กฐํ•˜๋Š”์ง€ ์•Œ์•„๋‚ผ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค.

var number int
var po *int
po = &number

 

์ด ๋•Œ number ๋ณ€์ˆ˜ ์•ž์— ๋ถ™์€ ampersand(&) ๋Š” ๋ฌด์—‡์„ ์˜๋ฏธํ•˜๋Š”๊ฐ€?

& ๊ธฐํ˜ธ๋Š” ๋ฉ”๋ชจ๋ฆฌ์˜ ์ฃผ์†Œ๋ฅผ ๋ช…์‹œํ•˜๋ผ๋Š” operator ๋กœ number ๋ณ€์ˆ˜๊ฐ€ ์–ด๋–ค ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ์— ๊ฐ’์„ ์ €์žฅํ•˜๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ์ฆ‰ &number ๋Š” ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋ฅผ ์˜๋ฏธํ•˜๊ธฐ์— po ํฌ์ธํ„ฐ ๋ณ€์ˆ˜์— ํ• ๋‹นํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค.

func main() {
	var number int = 10
	var pointer *int
	pointer = &number
	
	fmt.Println("number:", number)
	fmt.Println("pointer:", pointer)
	fmt.Println("*pointer:", *pointer)
	fmt.Println("&number:", &number)
}

> number: 10
> pointer: 0xc000104040
> *pointer: 10
> &number: 0xc000104040

 

number ๋ณ€์ˆ˜์˜ 10 ์ด ์ €์žฅ๋œ ์œ„์น˜๊ฐ€ `0xc000104040` ์ด๋ฏ€๋กœ, number ์˜ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋ฅผ ํ• ๋‹น๋ฐ›์€ pointer ์—ญ์‹œ ๋™์ผํ•œ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๊ฐ’์„ ์ถœ๋ ฅํ•œ๋‹ค.

 

์—ญ์ฐธ์กฐ

์œ„ ์˜ˆ์ œ์—์„œ pointer ๋ณ€์ˆ˜์— *๋ฅผ ๋ถ™์ด๋ฉด 10์ด ์ถœ๋ ฅ๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ–ˆ๋‹ค. pointer ๋ณ€์ˆ˜๋Š” number ์˜ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋ฅผ ์ฐธ์กฐํ•˜๋Š” ํฌ์ธํ„ฐ์ธ๋ฐ, ์ด ํฌ์ธํ„ฐ์— asterik(*) ์„ ๋ถ™์ด๋ฉด number ๊ฐ’์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ์ œ์˜ ์„ธ๋ฒˆ์งธ ์ถœ๋ ฅ๋ฌธ์—์„œ ํฌ์ธํ„ฐ ๋ณ€์ˆ˜์— asterik ์„ ๋ถ™์—ฌ ๊ฐ’(10)์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š”๊ฑธ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ์žˆ์Œ์„ ๋ณด์—ฌ์ค€๋‹ค. ๊ฐ’์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฑด, ์ˆ˜์ •๋„ ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ์˜๋ฏธ๋‹ค. ์•„๋ž˜ ์˜ˆ์ œ๋ฅผ ํ†ตํ•ด ํ™•์ธํ•ด๋ณด์ž.

 

func main() {
	var number int
	var pointer *int
	number = 10
	pointer = &number
	fmt.Println("[before] number:", number)
	// ์—ญ์ฐธ์กฐ๋กœ ๊ฐ’ ์ˆ˜์ • ์‹œ๋„
	*pointer = 0
	fmt.Println("*pointer:", *pointer)
	fmt.Println("[after] number:", number)
}

> [before] number: 10
> *pointer: 0
> [after] number: 0

 

๋ถ„๋ช… ์ตœ์ดˆ number ๋ณ€์ˆ˜๋Š” 10 ์„ ํ• ๋‹น๋ฐ›์ง€๋งŒ ๋งˆ์ง€๋ง‰ ์ถœ๋ ฅ๋ฌธ์—์„œ๋Š” 0 ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. *pointer ๋ฅผ ํ†ตํ•ด number ๋ณ€์ˆ˜์˜ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ ๊ฐ’(value of memory address) ์— ์ ‘๊ทผํ•˜์—ฌ ๋‹ค๋ฅธ ๊ฐ’(0)์„ ํ• ๋‹นํ•  ์ˆ˜ ์žˆ๋‹ค.

 

Pointer ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ 

์ด์ œ ๊ตฌ์กฐ์ฒด์—์„œ pointer ๋ฅผ ์‚ฌ์šฉํ•ด๋ณด์ž.

๋‘ ๊ฐœ ๋ฉ”์„œ๋“œ (editName, editNamePointer) ์˜ ๋ฉ”์„œ๋“œ ๋กœ์ง์€ ๊ฐ™์ง€๋งŒ ๋ฉ”์„œ๋“œ ์‹œ๊ทธ๋‹ˆ์ฒ˜์— ์ฐจ์ด๊ฐ€ ์žˆ๋‹ค. ์ „์ž๋Š” Item ๊ตฌ์กฐ์ฒด์˜ ๊ฐ’์„ ๋ฐ›๊ณ  ํ›„์ž๋Š” Item ๊ตฌ์กฐ์ฒด์˜ ํฌ์ธํ„ฐ๋ฅผ ์ „๋‹ฌ๋ฐ›๋Š”๋‹ค. ์ด๊ฒƒ์ด ์–ด๋–ค ์ฐจ์ด๋ฅผ ๋งŒ๋“œ๋Š”์ง€ ์•Œ์•„๋ณด์ž.

type Item struct { 
	name string
}

func editName(item Item) {
	item.name = "์ปคํ”ผ"
	fmt.Println("editName:", item.name)
	fmt.Println(&item.name)
}

func editNamePointer(item *Item) {
	item.name = "์ปคํ”ผ"
	fmt.Println("editName:", item.name)
	fmt.Println(&item.name)
}

func main() {
	item := Item {"์Œ๋ฃŒ์ˆ˜"}
	fmt.Println("์ถœ๋ ฅ:", item.name)
	fmt.Println("์ถœ๋ ฅ:", &item.name)
	
	editName(item)
	fmt.Println("๊ฒฐ๊ณผ:", item.name)
	
	// &item ์€ item ๊ตฌ์กฐ์ฒด์˜ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ -> ์ธ์ž๋กœ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋ฅผ ๋„˜๊ธด๋‹ค.
	editNamePointer(&item) // item ์„ ๋„ฃ์œผ๋ฉด compile Error ๋ฐœ์ƒ
	fmt.Println("๊ฒฐ๊ณผ:", item.name)
}

> ์ถœ๋ ฅ: ์Œ๋ฃŒ์ˆ˜
> ์ถœ๋ ฅ: 0xc00009a070
> editName: ์ปคํ”ผ
> 0xc00009a090
> ๊ฒฐ๊ณผ: ์Œ๋ฃŒ์ˆ˜ // name ์ด ์ปคํ”ผ๋กœ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Œ (์›๋ณธ ์˜ํ–ฅ ๋ฐ›์ง€ ์•Š์Œ)
> editName: ์ปคํ”ผ
> 0xc00009a070
> ๊ฒฐ๊ณผ: ์ปคํ”ผ // name ์ด ์ปคํ”ผ๋กœ ๋ณ€๊ฒฝ๋จ (์›๋ณธ ์ˆ˜์ •๋จ)

// ๊ฐ ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋ฅผ ์ถœ๋ ฅํ•˜๋ฉด ์„œ๋กœ ๋‹ค๋ฅธ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๊ฐ€ ๋„˜์–ด์™”์Œ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

 

Go ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ Call by value ๋ฅผ ๋”ฐ๋ฅด๊ธฐ์— ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๋ณต์‚ฌํ•ด์„œ ํ•จ์ˆ˜ ๋‚ด๋ถ€๋กœ ์ „๋‹ฌํ•œ๋‹ค. ์ฆ‰ ์›๋ณธ ๊ฐ์ฒด๊ฐ€ ์•„๋‹Œ ๋ณต์‚ฌ๋ณธ์„ ๋งŒ๋“ค์–ด ๋ฉ”์„œ๋“œ์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋„˜๊ธฐ๋Š” ์…ˆ์ด๋‹ค. ๋งŒ์•ฝ ์›๋ณธ์„ ์ˆ˜์ •ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ํฌ์ธํ„ฐ๋ฅผ ํ†ตํ•ด ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

editNamePointer ๋Š” Item ๊ฐ์ฒด์˜ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋ฅผ ํฌ์ธํ„ฐ ๋ณ€์ˆ˜ ํ˜•ํƒœ๋กœ ์ „๋‹ฌ๋ฐ›๋Š”๋‹ค. ์ฆ‰ editNamePointer() ๋‚ด๋ถ€๋Š” ์ „๋‹ฌ๋ฐ›์€ ์ธ์ž์˜ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋กœ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜์—ฌ ์›๋ณธ์˜ ๊ฐ’์„ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. 

๋ฐ˜๋ฉด editName ๋Š” ์ธ์ž๋กœ ์ผ๋ฐ˜ ๊ฐ์ฒด๋ฅผ ์ „๋‹ฌ๋ฐ›๋Š”๋ฐ, ์—ฌ๊ธฐ์„œ ์ผ๋ฐ˜ ๊ฐ์ฒด๋ž€ ์›๋ณธ์˜ ๋ณต์‚ฌ๋ณธ์„ ์˜๋ฏธํ•œ๋‹ค. ์ฆ‰ ๋ณต์‚ฌ๋ณธ์˜ ๊ฐ’์„ ์ˆ˜์ •ํ•˜๋”๋ผ๋„ ์›๋ณธ์€ ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— editName() ํ•จ์ˆ˜๋ฅผ escape ํ•œ ํ›„์— item ๊ฐ์ฒด์˜ ๊ฐ’์„ ํ™•์ธํ•˜๋ฉด ๋ณ€ํ•˜์ง€ ์•Š์€ ๊ฑธ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

 

Q. editNamePointer ๋Š” ์ธ์ž๋กœ ํฌ์ธํ„ฐ ๋ณ€์ˆ˜๋ฅผ ๋ฐ›๋Š”๋‹ค. ์ธ์ž๋Š” asterik(*)์ธ๋ฐ ํ•จ์ˆ˜ ํ˜ธ์ถœ๋ถ€์—์„œ ๋„˜๊ธฐ๋Š” ๊ฒƒ์€ ampersand(&) ๋‹ค. ๊ทธ๋Ÿผ ๋ฉ”์„œ๋“œ ์ •์˜ ํ•  ๋•Œ & ํƒ€์ž…์œผ๋กœ ์ธ์ž๋ฅผ ์ •์˜ํ•˜๋ฉด ์™œ ์ปดํŒŒ์ผ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ• ๊นŒ?

๋ฐ”๋กœ ํ„ฐ์ง€๋Š” ์ปดํŒŒ์ผ ์—๋Ÿฌ

 

๋ผ๋Š” ์ดˆ๋ณด์ ์ธ ๊ถ๊ธˆ์ฆ์„ ๊ฐ€์ ธ๋ดค๋‹ค.

& ๋Š” ์—ฐ์‚ฐ์ž๋กœ์จ “์ด ๊ฐ’์˜ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค” ๋ฅผ ์˜๋ฏธํ•œ๋‹ค. ์ฆ‰ ์–ด๋–ค ๊ฐ’์˜ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋ฅผ ๊ฐ€์ ธ์˜ฌ ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ์—ฐ์‚ฐ์ž์ด๊ธฐ์— ํƒ€์ž…์„ ์„ ์–ธ์‹œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์ ์ ˆํ•˜์ง€ ์•Š๋‹ค. 

 

์ •๋ฆฌํ•˜๋ฉด
- *Item ์€ “Item ๋ณ€์ˆ˜๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ํฌ์ธํ„ฐ ํƒ€์ž…”
- &Item ์€ “Item ๋ณ€์ˆ˜์˜ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ”

 

 

๊ทธ๋Ÿผ Go ๋Š” ์™œ ๊ตณ์ด ํฌ์ธํ„ฐ๋ฅผ ๋„์ž…ํ–ˆ์„๊นŒ?

Go ๋Š” ์•ˆ์ •์„ฑ๊ณผ ๊ฐ„๊ฒฐํ•จ์ด๋ผ๋Š” ์–ธ์–ด ์ฒ ํ•™ ์•„๋ž˜ call by value ๋กœ ์„ค๊ณ„๋˜์–ด ๊ฐœ๋ฐœ์ž๊ฐ€ ์ฝ”๋“œ์˜ ๋™์ž‘์„ ๋ช…ํ™•ํžˆ ์ดํ•ดํ•˜๊ณ , ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ์™€ ๊ด€๋ จ๋œ ๋ฒ„๊ทธ๋ฅผ ์ค„์ด๋ฉฐ, ์ง๊ด€์ ์ธ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ฒฝํ—˜์„ ์ œ๊ณตํ•œ๋‹ค. Go ๊ฐ€ call by reference ๋กœ ๋™์ž‘ํ–ˆ๋‹ค๋ฉด, ๋ฐ์ดํ„ฐ๊ฐ€ ์–ด๋””์„œ ์–ด๋–ป๊ฒŒ ๋ณ€๊ฒฝ๋˜๋Š”์ง€ ์ถ”์ ํ•˜๊ธฐ ์–ด๋ ค์›Œ ์ฝ”๋“œ์˜ ๋ณต์žก์„ฑ์„ ์ฆ๊ฐ€์‹œํ‚จ๋‹ค. Go์˜ call by value๋Š” ์ด๋Ÿฐ ๋ณต์žก์„ฑ์„ ์ค„์ด๊ณ  ์ฝ”๋“œ์˜ ์˜ˆ์ธก ๊ฐ€๋Šฅ์„ฑ์„ ๋†’์ด๋Š” ํšจ๊ณผ๋ฅผ ๊ฐ€์ ธ์™”๋‹ค.

์ด๋Ÿฐ ์–ธ์–ด ์ฒ ํ•™์„ ๊ธฐ์กฐ๋กœ Pointer ๋ฅผ ์ƒ๊ฐํ•ด๋ณด์ž.

type HugeStruct struct {
    data [1000000]int
    // ๋งค์šฐ ํฐ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ง„ ๊ตฌ์กฐ์ฒด
}

// ํฌ์ธํ„ฐ ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ
func processData(h HugeStruct) {
    // 1,000,000๊ฐœ์˜ ์ •์ˆ˜๊ฐ€ ๋ชจ๋‘ ๋ณต์‚ฌ๋จ!
}

// ํฌ์ธํ„ฐ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ
func processDataPtr(h *HugeStruct) {
    // ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋งŒ ๋ณต์‚ฌ (8๋ฐ”์ดํŠธ ์ •๋„)
}

 

ํฌ์ธํ„ฐ๋Š” ๊ฐ’ ์ž์ฒด๋ฅผ ๋ณต์‚ฌํ•˜์ง€ ์•Š๊ณ  ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋ฅผ ์ „๋‹ฌํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์„ ์ค„์ด๊ณ , ๋Œ€๊ทœ๋ชจ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃฐ ๋•Œ ๋ถˆํ•„์š”ํ•œ ๋ณต์‚ฌ๋ฅผ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ์‹œ์ฒ˜๋Ÿผ HugeStruct ๊ฐ™์€ ๋Œ€๊ทœ๋ชจ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ’์œผ๋กœ ์ „๋‹ฌํ•˜๋ฉด ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ๋งˆ๋‹ค HugeStruct ์ „์ฒด๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ์— ๋ณต์‚ฌ๋œ๋‹ค. ์ด ๊ณผ์ •์ด ๋ฐ˜๋ณต๋˜๋ฉด ์ตœ์•…์˜ ๊ฒฝ์šฐ OOM(Out Of Memory)์ด ๋ฐœ์ƒํ•  ๊ฐ€๋Šฅ์„ฑ๋„ ์žˆ๋‹ค.

๋ฐ˜๋ฉด ํฌ์ธํ„ฐ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด? 

๋Œ€๊ทœ๋ชจ ๋ฐ์ดํ„ฐ๋ฅผ ์ง์ ‘ ๋ณต์‚ฌํ•˜์ง€ ์•Š๊ณ  ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋งŒ ์ „๋‹ฌํ•˜๋ฏ€๋กœ ๋ณต์‚ฌ์— ๋”ฐ๋ฅธ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ์ค„์–ด๋“ค๊ณ , ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰๋„ ํฌ๊ฒŒ ์ ˆ๊ฐํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•จ์ˆ˜ ํ˜ธ์ถœ ์‹œ ๊ฐ’ ์ž์ฒด๊ฐ€ ์•„๋‹Œ ์ฃผ์†Œ๋ฅผ ์ „๋‹ฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋™์ผํ•œ ๋ฐ์ดํ„ฐ์˜ ์—ฌ๋Ÿฌ ๋ณต์‚ฌ๋ณธ์„ ์ƒ์„ฑํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค. *HugeStruct์™€ ๊ฐ™์€ ํฌ์ธํ„ฐ๋ฅผ ํ•จ์ˆ˜๋กœ ์ „๋‹ฌํ•˜๋ฉด, ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ•˜๊ฑฐ๋‚˜ ์ˆ˜์ •ํ•  ๋•Œ๋„ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋ฅผ ํ†ตํ•ด ์›๋ณธ ๋ฐ์ดํ„ฐ์— ์ง์ ‘ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ ๋ฐ์ดํ„ฐ ์ˆ˜์ •์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ์—” ๋ณต์‚ฌ๋ณธ์ด ์•„๋‹Œ ์›๋ณธ ๋ฐ์ดํ„ฐ๋ฅผ ์ง์ ‘ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์–ด ๋ถˆํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ ๋ณต์‚ฌ๋„ ์ค„์—ฌ ์„ฑ๋Šฅ์„ ๋†’์ผ ์ˆ˜ ์žˆ๋‹ค.

 

์•„๋ž˜ ์ฝ”๋“œ๋Š” pointer ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ฝ”๋“œ์˜ ์˜๋„๋ฅผ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์„ ๋ณด์—ฌ์ค€๋‹ค.

type User struct {
    name string
    age  int
}

// ํฌ์ธํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ•จ์ˆ˜๊ฐ€ ์›๋ณธ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ 
// ํƒ€์ž… ์‹œ๊ทธ๋‹ˆ์ฒ˜๋งŒ์œผ๋กœ๋„ ๋ช…ํ™•ํ•˜๊ฒŒ ์•Œ ์ˆ˜ ์žˆ์Œ
func updateAge(u *User) {
    u.age += 1
}

// ํฌ์ธํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฉด ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Œ์„ ์•”์‹œ
func displayInfo(u User) {
    fmt.Println(u.name, u.age)
}

 

๋ฉ”์„œ๋“œ ์‹œ๊ทธ๋‹ˆ์ฒ˜์— ํฌ์ธํ„ฐ๋ฅผ ์ •์˜ํ•˜๋ฉด ํ•ด๋‹น ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ ์ธ์ž๋กœ ์ „๋‹ฌ๋ฐ›์€ ๊ฐ’์„ ์ˆ˜์ •ํ•˜๊ฒ ๋‹ค๋Š” ์˜๋„๋ฅผ ๋“œ๋Ÿฌ๋‚ธ๋‹ค. ๋ฐ˜๋ฉด ํฌ์ธํ„ฐ๊ฐ€ ์•„๋‹Œ ๊ฐ’ ๊ฐ์ฒด๋ฅผ ์ธ์ž๋กœ ์ •์˜ํ•˜๋ฉด, ํ•ด๋‹น ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ๋Š” ๊ฐ’์„ ์ˆ˜์ •ํ•˜์ง€ ์•Š๊ณ  ์‚ฌ์šฉ(read)๋งŒ ํ•˜๊ฒ ๋‹ค๋Š” ์˜๋„๋ฅผ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๋‹ค. ํฌ์ธํ„ฐ๊ฐ€ ๋‹ค์†Œ ์–ด๋ ต๊ฒŒ ๋Š๊ปด์งˆ ์ˆ˜ ์žˆ์ง€๋งŒ ๋ฐ์ดํ„ฐ ์ƒํƒœ ๋ณ€๊ฒฝ์˜ ๋ช…ํ™•์„ฑ์„ ๋“œ๋Ÿฌ๋‚ด๊ธฐ์— ๊ฐœ๋ฐœ ์‹œ ์ฝ”๋“œ์˜ ์˜๋„๋ฅผ ๋ช…ํ™•ํžˆ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

๋ฒˆ์™ธ) Java ์˜ ํฌ์ธํ„ฐ๋Š”?

Java ๋Š” ํฌ์ธํ„ฐ ๊ฐœ๋…์ด ์—†๋Š”๋ฐ ์–ธ์–ด ์ž์ฒด๊ฐ€ ์ด๋ฏธ call by reference ๋กœ ์„ค๊ณ„ ๋˜์–ด์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ž๋ฐ”์˜ ๊ฒฝ์šฐ ๊ฐ์ฒด๋ฅผ ๋‹ค๋ฃฐ ๋•Œ ํ•ญ์ƒ ์ฐธ์กฐ(reference)๋ฅผ ํ†ตํ•ด ์ฒ˜๋ฆฌํ•˜๋Š”๋ฐ, Go์˜ ํฌ์ธํ„ฐ์™€ ๋‹ฌ๋ฆฌ ๋ช…์‹œ์ ์ด์ง€ ์•Š๊ณ  ์–ธ์–ด ์ฐจ์›์—์„œ ์ž๋™์œผ๋กœ ์ฒ˜๋ฆฌ๋œ๋‹ค.

// Java
class HugeObject {
    int[] data = new int[1000000];
    
    void processData() {
        // data ์ฒ˜๋ฆฌ
    }
}

void someMethod(HugeObject obj) {  // ์ฐธ์กฐ๋กœ ์ „๋‹ฌ๋จ
    obj.processData();  // ์›๋ณธ ๊ฐ์ฒด์˜ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ
}

// ์‚ฌ์šฉ
HugeObject huge = new HugeObject();
someMethod(huge);  // ์ฐธ์กฐ๋งŒ ์ „๋‹ฌ๋จ (์‹ค์ œ ๋ฐ์ดํ„ฐ๋Š” ๋ณต์‚ฌ๋˜์ง€ ์•Š์Œ)

 

go ์™€ ๋‹ฌ๋ฆฌ ํฌ์ธํ„ฐ๋ฅผ ๋ช…์‹œํ•˜์ง€ ์•Š๋”๋ผ๋„ ์–ธ์–ด ์ฐจ์›์—์„œ ์ž๋™์œผ๋กœ ์ฐธ์กฐ๋ฅผ ๋„˜๊ธฐ๊ธฐ ๋•Œ๋ฌธ์— ๋ณ„๋„์˜ ๋ฉ”๋ชจ๋ฆฌ ๋ณต์‚ฌ๊ฐ€ ๋ฐœ์ƒ๋˜์ง€ ์•Š๋Š”๋‹ค. ์ฆ‰ ์›๋ณธ ๋ฐ์ดํ„ฐ๋ฅผ ๋„˜๊ธฐ๋Š” ๊ฒƒ(์ฒ˜๋Ÿผ ๋ณด์ž„)์œผ๋กœ ๋ฉ”์„œ๋“œ ๋‚ด๋ถ€์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ง์ ‘ ์ฝ๊ณ  ์ˆ˜์ •๊นŒ์ง€ ํ•  ์ˆ˜ ์žˆ๋‹ค. HugeObject ์ฒ˜๋Ÿผ ํฐ ๊ฐ์ฒด๋ฅผ ์ „๋‹ฌํ•  ๋•Œ๋„ ๋‹น์—ฐํžˆ ๋ฉ”๋ชจ๋ฆฌ ๋ณต์‚ฌ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค.

 

 

๋งˆ๋ฌด๋ฆฌ

Go๊ฐ€ ํฌ์ธํ„ฐ๋ฅผ ๋„์ž…ํ•œ ์ด์œ ๋Š” ํฌ๊ฒŒ ์„ธ ๊ฐ€์ง€๋กœ ์ •๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค:

  1. ๋ฉ”๋ชจ๋ฆฌ ํšจ์œจ์„ฑ:
    • ํฐ ๊ตฌ์กฐ์ฒด๋‚˜ ๋ฐ์ดํ„ฐ๋ฅผ ํ•จ์ˆ˜์— ์ „๋‹ฌํ•  ๋•Œ ์ „์ฒด๋ฅผ ๋ณต์‚ฌํ•˜์ง€ ์•Š๊ณ  ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋งŒ ์ „๋‹ฌ
    • ๋ถˆํ•„์š”ํ•œ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ์„ ์ค„์ด๊ณ  ์„ฑ๋Šฅ ํ–ฅ์ƒ ๋„๋ชจ
    • OOM(Out Of Memory) ๊ฐ™์€ ์ž ์žฌ์  ๋ฌธ์ œ ์˜ˆ๋ฐฉ
  2. ์ฝ”๋“œ ์˜๋„์˜ ๋ช…ํ™•์„ฑ:
    • ํฌ์ธํ„ฐ ์‚ฌ์šฉ ์—ฌ๋ถ€๋ฅผ ํ†ตํ•ด ํ•จ์ˆ˜๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ •ํ•  ๊ฒƒ์ธ์ง€ ๋‹จ์ˆœ ์ฐธ์กฐํ•  ๊ฒƒ์ธ์ง€ ๋ช…์‹œ ๊ฐ€๋Šฅ
    • ๋ฉ”์„œ๋“œ ์‹œ๊ทธ๋‹ˆ์ฒ˜๋งŒ์œผ๋กœ๋„ ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ ์—ฌ๋ถ€๋ฅผ ์˜ˆ์ธก ๊ฐ€๋Šฅ
    • ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜์„ฑ ํ–ฅ์ƒ
  3. ๊ฐœ๋ฐœ์ž์—๊ฒŒ ๋” ๋งŽ์€ ์ œ์–ด๊ถŒ ์ œ๊ณต:
    • Call by value๋ฅผ ๊ธฐ๋ณธ์œผ๋กœ ํ•˜๋˜, ํ•„์š”ํ•œ ๊ฒฝ์šฐ ํฌ์ธํ„ฐ๋ฅผ ํ†ตํ•œ ์ฐธ์กฐ ์ „๋‹ฌ ๊ฐ€๋Šฅ
    • Java์™€ ๋‹ฌ๋ฆฌ ๊ฐ’ ๋ณต์‚ฌ์™€ ์ฐธ์กฐ ์ „๋‹ฌ์„ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋ช…์‹œ์ ์œผ๋กœ ์„ ํƒ ๊ฐ€๋Šฅ
    • ์ƒํ™ฉ์— ๋”ฐ๋ฅธ ์ตœ์ ์˜ ๋ฐฉ๋ฒ• ์„ ํƒ ๊ฐ€๋Šฅ

์ด์ฒ˜๋Ÿผ Go์˜ ํฌ์ธํ„ฐ๋Š” ๋‹จ์ˆœํžˆ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋ฅผ ๋‹ค๋ฃจ๋Š” ๋„๊ตฌ๋ฅผ ๋„˜์–ด, ์„ฑ๋Šฅ ์ตœ์ ํ™”์™€ ์ฝ”๋“œ ์˜๋„์˜ ๋ช…ํ™•ํ•œ ํ‘œํ˜„์ด๋ผ๋Š” ๋‘ ๊ฐ€์ง€ ํ•ต์‹ฌ ๊ฐ€์น˜๋ฅผ ์ œ๊ณตํ•œ๋‹ค. Go๊ฐ€ ์ถ”๊ตฌํ•˜๋Š” '๋ช…์‹œ์ ์ธ ๊ฒƒ์ด ์•”์‹œ์ ์ธ ๊ฒƒ๋ณด๋‹ค ๋‚ซ๋‹ค'๋Š” ์ฒ ํ•™์ด ํฌ์ธํ„ฐ๋ฅผ ํ†ตํ•ด ์ž˜ ๊ตฌํ˜„๋˜์–ด ์žˆ์Œ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.