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๋ ์์ ํ์ ์ ์ฌ์ฉ๋์ด ์ ๋ก๊ฐ์ ๋ฐํํ๋ค.