[Golang] new, make, pointer ํƒ๊ตฌ

2024. 1. 7. 12:11ใ†Backend/๐Ÿฉต Go

๋ชฉ์ฐจ
1. new ํ‚ค์›Œ๋“œ
2. ํ‹ˆ์ƒˆ ํฌ์ธํ„ฐ ์„ค๋ช…
3. ํ‚ค์›Œ๋“œ
4. ์š”์•ฝ

 

 

Go ์–ธ์–ด์˜ new ์™€ make ๋Š” ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค๋Š” ๊ณตํ†ต์ ์ด ์žˆ์ง€๋งŒ ์ ์šฉํ•  ์ƒํ™ฉ๊ณผ ๋Œ€์ƒ์ด ๋‹ค๋ฅธ๋‹ค.
๋‘˜์˜ ๊ณตํ†ต์ ๊ณผ ์ฐจ์ด์ ์„ ๋น„๊ตํ•˜์—ฌ ์–ด๋Š ์ƒํ™ฉ์— ์ ํ•ฉํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์•Œ์•„๋ณด๊ณ , ๋”๋ถˆ์–ด ์•Œ๊ฒŒ๋œ ํฌ์ธํ„ฐ ์ง€์‹๋„ ๊ฐ™์ด ์ •๋ฆฌํ•ด๋ณธ๋‹ค.

 


 

new ํ‚ค์›Œ๋“œ

 

์‚ฌ์šฉ ๋ชฉ์ 

new ๋Š” ์ฃผ๋กœ ๊ธฐ๋ณธ ๋ฐ์ดํ„ฐ ํƒ€์ž…(์›์‹œ ํƒ€์ž…)์˜ ํฌ์ธํ„ฐ๋ฅผ ํ• ๋‹นํ•  ๋•Œ ์‚ฌ์šฉ๋œ๋‹ค.

์ฆ‰ ์ƒˆ๋กœ์šด ์ธ์Šคํ„ด์Šค๋ฅผ ํ• ๋‹นํ•˜๊ณ  ํ•ด๋‹น ์ธ์Šคํ„ด์Šค์˜ ํฌ์ธํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. new ๋Š” ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น ํ›„ ์ œ๋กœ๊ฐ’์œผ๋กœ ์ดˆ๊ธฐํ™”๋œ ํฌ์ธํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉฐ, new ๋กœ ์ƒ์„ฑ๋œ ๊ฐ’์€ 0 ๋˜๋Š” nil ๊ฐ’์œผ๋กœ ์ดˆ๊ธฐํ™” ๋œ๋‹ค.

var k *int
k = new(int)
fmt.Println("k: ", k, " *k: ", *k)

>>>k:  0x1400011e018  *k:  0

 

 

์˜ˆ์‹œ

var i *int // (1)
i = new(int) // (2)
*i = 42 // (3)

 

(1 ) i ๋ณ€์ˆ˜๋Š” ์•„์ง ์ดˆ๊ธฐํ™” ๋˜์ง€ ์•Š์€ nil ๊ฐ’์„ ๊ฐ€์ง„ ํฌ์ธํ„ฐ

(2) new() ๋Š” ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹น ํ›„ ์ œ๋กœ๊ฐ’์œผ๋กœ ์ดˆ๊ธฐํ™”๋œ ํฌ์ธํ„ฐ๋ฅผ ๋ฐ˜ํ™˜

(3) *i ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ i ๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋ฉ”๋ชจ๋ฆฌ์— 42๋ผ๋Š” ๊ฐ’์„ ํ• ๋‹น. *i ๋Š” ํฌ์ธํ„ฐ i ๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋ฉ”๋ชจ๋ฆฌ์— ์ ‘๊ทผํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค. ์ฆ‰ ์ด ์ž‘์—…์€ ๋™์ ์œผ๋กœ ํ• ๋‹น๋œ ๋ฉ”๋ชจ๋ฆฌ์— 42๋ฅผ ์ €์žฅํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

 

๊ทธ๋Ÿผ 42 ๋Œ€์‹  age ๋ผ๋Š” ๋ณ€์ˆ˜๋ฅผ ํ• ๋‹นํ•ด๋ณด์ž. 

var i *int
i = new(int)
var age int = 40
*i = age
fmt.Println("i: ", i, " *i : ", *i, " age : ", age)


>>> i:  0x1400000e0b0  *i :  40  age :  40

 

i ๋ณ€์ˆ˜ ์ž์ฒด๋Š” ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋ฅผ ์ถœ๋ ฅํ•˜๊ณ , *i ๋ฅผ ํ†ตํ•ด i ๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅ๋œ ๊ฐ’(40)์„ ์ถœ๋ ฅํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๊ทธ๋Ÿผ age ๋ณ€์ˆ˜์˜ ๊ฐ’์ด ๋ณ€๊ฒฝ๋œ๋‹ค๋ฉด(40 -> 20) i ๋Š” ์–ด๋–ป๊ฒŒ ๋ ๊นŒ?

var i *int
i = new(int)
var age int = 40
*i = age
fmt.Println("i: ", i, " *i : ", *i, " age : ", age)
age = 20
fmt.Println("i: ", i, " *i : ", *i, " age : ", age)
    
>>> i:  0x1400000e0b0  *i :  40  age :  40
>>> i:  0x1400000e0b0  *i :  40  age :  20

 

age ๊ฐ’์€ ๋ณ€๊ฒฝ๋˜๋”๋ผ๋„ *i ์˜ ๊ฐ’์€ ๊ทธ๋Œ€๋กœ ์œ ์ง€๋œ๋‹ค.

์™œ๋ƒํ•˜๋ฉด age=20 ์œผ๋กœ ์„ ์–ธํ•˜๋”๋ผ๋„ i ๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ์— ์ €์žฅ๋œ ๊ฐ’์€ ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

i ๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฐ’๋„ ์ˆ˜์ •ํ•˜๋ ค๋ฉด *i=age ๋ฅผ ํ•œ๋ฒˆ ๋” ํ• ๋‹นํ•˜๋Š” ๊ณผ์ •์ด ํ•„์š”ํ•˜๋‹ค. 

 

์ •๋ฆฌ

- new๋กœ ์„ ์–ธ๋œ ๋ณ€์ˆ˜๋Š” ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹น๋ฐ›๊ณ  ์ œ๋กœ๊ฐ’์œผ๋กœ ์ดˆ๊ธฐํ™”๋œ ํฌ์ธํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

- ํ•ด๋‹น ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ์— ์ €์žฅ๋œ ๊ฐ’(ex. age=40)์€ ์›๋ณธ ๋ณ€์ˆ˜(age)์˜ ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜๋”๋ผ๋„ ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š๋Š”๋‹ค. 

 


 

ํ‹ˆ์ƒˆ ํฌ์ธํ„ฐ ์„ค๋ช…

๊ทธ๋Ÿผ ์œ„ ์˜ˆ์‹œ์™€ ๋‹ฌ๋ฆฌ ํฌ์ธํ„ฐ ๋ณ€์ˆ˜๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ ์ผ๋ฐ˜ ๋ณ€์ˆ˜ ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜๋Š” ๊ฒฝ์šฐ๋ฅผ ์•Œ์•„๋ณด์ž.

ํฌ์ธํ„ฐ๋ฅผ ํ™œ์šฉํ•œ var i *int ์™€ ์ง์ ‘ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” var i int ์˜ ์ฃผ์š” ์ฐจ์ด๋Š” ๋ฐ์ดํ„ฐ ์ €์žฅ ๋ฐฉ์‹์— ์žˆ๋‹ค. 

 

1. var i *int:

  • i๊ฐ€ ์ •์ˆ˜๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ํฌ์ธํ„ฐ์ž„์„ ๋‚˜ํƒ€๋‚ธ๋‹ค.
  • i๋Š” ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋ฅผ ์ €์žฅํ•˜๊ณ  ์žˆ์œผ๋ฉฐ, ํ•ด๋‹น ์ฃผ์†Œ์— ์œ„์น˜ํ•œ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅ๋œ ๊ฐ’์€ ์ •์ˆ˜.
  • ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์•˜์„ ๊ฒฝ์šฐ nil ๊ฐ’์„ ๋ฐ˜ํ™˜.

 

2. var i int:

  • i๊ฐ€ ์ •์ˆ˜ ์ž์ฒด๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋ณ€์ˆ˜์ž„์„ ์˜๋ฏธ
  • i๋Š” ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๊ฐ€ ์•„๋‹Œ ์ง์ ‘์ ์œผ๋กœ ์ •์ˆ˜ ๊ฐ’์„ ์ €์žฅ
  • ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์•˜์„ ๊ฒฝ์šฐ ํ•ด๋‹น ์ •์ˆ˜ ํƒ€์ž…์˜ ์ œ๋กœ๊ฐ’(์˜ˆ: 0)์„ ๋ฐ˜ํ™˜

 

์˜ˆ์‹œ

age ๋Š” ์ •์ˆ˜ ์ž์ฒด๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋ณ€์ˆ˜, i๋Š” ์ •์ˆ˜๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ํฌ์ธํ„ฐ๋กœ ์„ ์–ธํ•œ๋‹ค.

 

(1) i ๋ฅผ ์ถœ๋ ฅํ•˜๋ฉด ์•„์ง ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ํ• ๋‹น๋˜์ง€ ์•Š์€, nil ๊ฐ’์„ ๊ฐ€์ง„ ํฌ์ธํ„ฐ๊ฐ€ ์ถœ๋ ฅ๋œ๋‹ค.

(2) &a ๋Š” ๋ณ€์ˆ˜ age ์˜ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.  ํฌ์ธํ„ฐ i ์—๋Š” age ๊ฐ’์˜ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๊ฐ€ ํ• ๋‹น๋œ๋‹ค. ์ฆ‰ i ๋Š” age ์™€ ๋™์ผํ•œ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค.

(3) ํฌ์ธํ„ฐ i์˜ ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๋ฉด age ๊ฐ’๋„ ๋ณ€๊ฒฝ๋œ๋‹ค. ๋‘˜๋‹ค ๋™์ผํ•œ ๋ฉ”๋ชจ๋ฅผ ์ฐธ์กฐํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

(4) ๋ณ€์ˆ˜ age ๋Š” 42๊ฐ€ ์•„๋‹Œ 10 ์„ ์ถœ๋ ฅํ•œ๋‹ค. 

 

ํฌ์ธํ„ฐ i ๋Š” age ๋ณ€์ˆ˜๊ฐ€ ์ €์žฅ๋œ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ฒŒ ๋˜๋ฉด์„œ i๊ฐ€ ์ €์žฅํ•˜๋Š” ๊ฐ’(*i)์ด ๋ณ€๊ฒฝ๋˜๋ฉด age ์˜ ๊ฐ’๋„ ๋ณ€ํ•˜๊ฒŒ ๋œ๋‹ค. 

var age int = 42
var i *int
fmt.Println("i: ", i)     // (1) ์ถœ๋ ฅ: nil
fmt.Println("age: ", age) // ์ถœ๋ ฅ: 42
i = &age                  // (2) b๋Š” a์˜ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋ฅผ ๊ฐ€๋ฆฌํ‚ด
fmt.Println("i: ", i)     // ์ถœ๋ ฅ: 0x1400000e0c8 (memory address)
*i = 10                   // (3) b์˜ ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๋ฉด a๋„ ๊ฐ™์ด ๋ณ€๊ฒฝ๋จ (๋‘˜ ๋‹ค ๊ฐ™์€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ฐธ์กฐํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ)

fmt.Println("age: ", age) // (4) ์ถœ๋ ฅ: 10
fmt.Println("*i: ", *i)   // ์ถœ๋ ฅ: 10


>>> i:  <nil>
>>> age:  42
>>> i:  0x1400000e0b8
>>> age:  10
>>> *i:  10

 

 


make ํ‚ค์›Œ๋“œ

 

์‚ฌ์šฉ ๋ชฉ์ 

make ๋Š” ์ฃผ๋กœ slice, map, channel ๊ฐ™์€ ์ฐธ์กฐ ํƒ€์ž…์˜ ์ดˆ๊ธฐํ™” ๋ฐ ํ• ๋‹น์— ์‚ฌ์šฉ๋œ๋‹ค.

make ๋กœ ์ƒ์„ฑ๋œ ์ธ์Šคํ„ด์Šค๋Š” ์ดˆ๊ธฐํ™”๋œ ์ƒํƒœ๋กœ ๋ฐ˜ํ™˜๋œ๋‹ค. (nil ์ด๋‚˜ 0 ์ด ์•„๋‹Œ ์ดˆ๊ธฐํ™”๋œ ๊ฐ’์ด ๋ฐ˜ํ™˜)

 

new ์™€ ์ฐจ์ด์ 
new ๋Š” ์ฃผ๋กœ ์›์‹œํƒ€์ž…์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ๋ฅผ ํ• ๋‹นํ•  ๋•Œ ์‚ฌ์šฉ๋˜๊ณ  ์ œ๋กœ๊ฐ’(nil, 0)์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

make ๋Š” ์ฃผ๋กœ ์ฐธ์กฐํƒ€์ž…์— ๋Œ€ํ•œ ์ดˆ๊ธฐํ™” ๋ฐ ํ• ๋‹น์— ์‚ฌ์šฉ๋˜๋ฉฐ ์ดˆ๊ธฐํ™”๋œ ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

 

์˜ˆ์‹œ

candies := []int{2, 3, 4, 1, 5} 
var lenCandy = len(candies)
result := make([]bool, lenCandy) // (1)

 

(1) make ํ‚ค์›Œ๋“œ๋กœ result ์Šฌ๋ผ์ด์Šค๋ฅผ ์„ ์–ธ ๋ฐ ์ดˆ๊ธฐํ™”ํ–ˆ๋‹ค. 

result ๋ณ€์ˆ˜์—๋Š” (candies ๋ฐฐ์—ด ๊ธธ์ด์˜) false ๋กœ ์ดˆ๊ธฐํ™”๋œ slice ํƒ€์ž…์ด ํ• ๋‹น๋œ๋‹ค.

slice ๋Š” ์ฐธ์กฐํƒ€์ž…์ด๊ธฐ ๋•Œ๋ฌธ์— new ๊ฐ€ ์•„๋‹Œ make ๋ฅผ ํ†ตํ•ด ์„ ์–ธ๋œ๋‹ค.

 


 

์š”์•ฝ

- new ํ‚ค์›Œ๋“œ๋Š” ๊ธฐ๋ณธ ๋ฐ์ดํ„ฐ ํƒ€์ž…์˜ ํฌ์ธํ„ฐ๋ฅผ ํ• ๋‹นํ•˜๊ณ  ํ•ด๋‹น ์ธ์Šคํ„ด์Šค์˜ ํฌ์ธํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.  ๋งŒ์•ฝ new๋กœ ์ƒ์„ฑ๋œ ๋ณ€์ˆ˜๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋ฉ”๋ชจ๋ฆฌ์˜ ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜์–ด๋„ ์›๋ณธ ๋ณ€์ˆ˜์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๋Š”๋‹ค.

- make ํ‚ค์›Œ๋“œ๋Š” ์ฃผ๋กœ ์ฐธ์กฐ ํƒ€์ž…์ธ slice, map, channel ๋“ฑ์˜ ์ดˆ๊ธฐํ™” ๋ฐ ํ• ๋‹น์— ์‚ฌ์šฉ๋œ๋‹ค. make๋กœ ์ƒ์„ฑ๋œ ์ธ์Šคํ„ด์Šค๋Š” ์ดˆ๊ธฐํ™”๋œ ์ƒํƒœ๋กœ ๋ฐ˜ํ™˜๋˜๋ฉฐ, ์ดˆ๊ธฐ๊ฐ’์€ ํ•ด๋‹น ํƒ€์ž…์˜ ๊ธฐ๋ณธ๊ฐ’์ด ๋œ๋‹ค.

- new์™€์˜ ์ฃผ์š” ์ฐจ์ด์ ์€ make๋Š” ์ฐธ์กฐ ํƒ€์ž…์— ์‚ฌ์šฉ๋˜๊ณ  ์ดˆ๊ธฐํ™”๋œ ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉฐ, new๋Š” ์›์‹œ ํƒ€์ž…์— ์‚ฌ์šฉ๋˜์–ด ์ œ๋กœ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.