2025. 1. 22. 01:35ใBackend/๐ฉต Go
Go ์์ ...
์ Ellipsis (์ค์ํ) ์ฐ์ฐ์๋ผ๊ณ ๋ถ๋ฅธ๋ค. JS ์์๋ ์ด๋ฐ ๋ฌธ๋ฒ์ด ์๋ ๊ฑธ๋ก ๊ธฐ์ตํ๋ค.
Ellipsis ์ฐ์ฐ์์ ์ฃผ์ ์ฉ๋๋ ๋๊ฐ์ง ์ธ๋ฐ 1) ๊ฐ๋ณ์ธ์ ๋งค๊ฐ๋ณ์
, 2) ์ฌ๋ผ์ด์ค ํ์ฅ
์ ๋๋ก ์ ์ํ ์ ์๋ค.
1. ๊ฐ๋ณ์ธ์ (Variadic Parameters)
๊ฐ๋ณ ์ธ์๋ ํจ์๊ฐ ์์์ ๊ฐ์์ ์ธ์๋ฅผ ๋ฐ์ ์ ์๊ฒ ํ๋ ๊ธฐ๋ฅ์ด๋ค. ์๋ฅผ ๋ค์ด int ํ ์ธ์๋ฅผ ํ๋ผ๋ฏธํฐ๋ก ๋๊ฒจ์ผ ํ ๋ ํ๊ฐ๋ฅผ ๋๊ธฐ๊ฑฐ๋, ๊ทธ ์ด์์ ์๋ฅผ ๋๊ฒจ์ผ ํ๋ ๊ฒฝ์ฐ๋ฅผ ์๊ฐํด๋ณด์. ์ธ์์ ์๊ฐ ๋ณํ๋ ๊ฒฝ์ฐ, ๋ณดํต ๋ฐฐ์ด์ ์ธ์๋ก ๋ฐ์์ผ ํ๋ค๊ณ ์๊ฐํ ์ ์์ง๋ง ellipsis ๋ฅผ ์ฌ์ฉํ๋ฉด ํ๋ผ๋ฏธํฐ์ ํ์ ์ ๊ตณ์ด ๋ฐฐ์ด๋ก ๋ณ๊ฒฝํ ํ์๊ฐ ์๋ค.
์๋ ์์๋ฅผ ์ดํด๋ณด์. sum() ํจ์๋ ์ธ์๋ก int ํ ellipsis ๋ฅผ ๋ฐ์ ์ ์๋ค.
// ํจ์ ์ ์ ์
func sum(nums ...int) int {
total := 0
for _, num := range nums {
total += num
}
return total
}
// ํจ์ ํธ์ถ
sum(1, 2, 3)
sum(1, 2, 3, 4, 5)
์ ์์๋ฅผ ๋ณด๊ณ ๋ ์ฉ ํ ์ ์๋ค. ๊ทธ๋ฅ ๋ฐฐ์ด์ ๋๊ธฐ๋ฉด ๋๋ ๊ฒ ์๋๊ฐ? ๊ตณ์ด ellipsis ๋ฅผ ์ธ์์ ์ ์ธํด์ผํ๋? ๊ทธ๋ฐ ์๊ฐ์ด ๋ค์๋ค๋ฉด ์๋ ์ฝ๋๋ฅผ ๋ณด์. ์ฐจ์ด๊ฐ ๋๊ปด์ง์ค๋๊ฐ ๋ชจ๋ฅด๊ฒ ๋ค. ๊ฐ๋ณ ์ธ์๋ฅผ ์ฌ์ฉํ sum() ํจ์๋ ๊ตณ์ด ๋ฐฐ์ด์ ์ฌ์ฉํ์ง ์๊ณ ์ง์ ํจ์ ํธ์ถ์ด ๊ฐ๋ฅํ์ง๋ง, ๋ฐฐ์ด ์ฌ๋ผ์ด์ค๋ฅผ ์ธ์๋ก ๋ฐ๋ sumArray() ๋ ์ฌ๋ผ์ด์ค๋ฅผ ๋ช ์์ ์ผ๋ก ์์ฑํด์ค์ผ ํ๋ค.
// ๊ฐ๋ณ ์ธ์ ์ฌ์ฉ
func sum(numbers ...int) int {
...
}
// ์ง์ ํธ์ถ์ด ๊ฐํธํ๋ค
sum(1, 2, 3)
// ๋ฐฐ์ด/์ฌ๋ผ์ด์ค ์ฌ์ฉ
func sumArray(numbers []int) int {
...
}
// ํธ์ถ ์ ์ฌ๋ผ์ด์ค๋ฅผ ๋ช
์์ ์ผ๋ก ์์ฑํด์ผ ํ๋ค
sumArray([]int{1, 2, 3})
๋ ๋ค๋ฅธ ์์๋ฅผ ์ดํด๋ณด์. ๋ค์ ์์๋ ๋ฌธ์๋ฅผ concatenate ํ๋ ํจ์๋ก, elemetns ์ธ์๋ ๊ฐ๋ณ์ ์ผ๋ก string ํ์ ์ ๋ณ์๋ฅผ ๋ฃ์ ์ ์๋ค. concatenate ํ๊ณ ์ถ์ string ์ด ๋ช๊ฐ์ด๋ ์๊ด์์ด ์ธ์๋ฅผ ์ถ๊ฐํ ์ ์๋ค.
// ๋ฌธ์์ด ๊ฒฐํฉ ํจ์
func concatenate(delimeter string, elements ...string) string {
return strings.Join(elements, delimeter)
}
result := concatenate("-", "Go", "is", "awesome")
fmt.Println(result) // ์ถ๋ ฅ: Go-is-awesome
concatenate("-", "Go", "is", "awesome", "์ญ์ญ", "์ถ๊ฐ", "๊ฐ๋ฅ")
2. ์ฌ๋ผ์ด์ค ํ์ฅ
๋ค์์ ์ฌ๋ผ์ด์ค ํ์ฅ ์์๋ ellipsis ๋ฅผ ์ ์ฉํ๊ฒ ํ์ฉํ ์ ์๋ค.
์ด์ 1๋ฒ ์์์์๋ type ์์ ...
์ด ๋ถ์์ง๋ง, ์ฌ๋ผ์ด์ค๋ฅผ ํ์ฅํ๋(์ฝ๊ฒ ๋งํด ๋ฐฐ์ด์ ๋ฒ๊ฒจ๋ฒ๋ฆฌ๋) ๊ฒฝ์ฐ์ ...
๋ฅผ ๋ณ์ ๋ค์ ๋ถ์ด๋ฉด ๋์ด๋ค.
nums := []int{1, 2, 3}
otherNums := []int{4, 5, 6}
// ์ฌ๋ผ์ด์ค๋ฅผ ๊ฐ๋ณ ์์๋ก ํ์ฅํ์ฌ ์ ๋ฌ
allNums := append(nums, otherNums...)
// ellipsis๋ฅผ ์ฌ์ฉํ์ง ์๋๋ค๋ฉด ์๋์ฒ๋ผ ๊ฐ ์ธ์๋ฅผ ์ํํด์ผ ํ๋ค.
allNums := nums
for _, num := range otherNums {
allNums = append(allNums, num)
}
// ellipsis ๋ฅผ ์ฌ์ฉํ ๊ฒ ๋ณด๋จ ๊ฐ๋
์ฑ์ด ์ข์ง์๋ค.
3. ์ค์ ์์
์ด๋ฒ ๊ธ์ ์ฐ๊ฒ ๋ ์ด์ ๋ฅผ ์ฝ๋๋ก ์ค๋ช ํด๋ณด๋ ค ํ๋ค.
๊ธฐ์กด์๋ ํ๋์ redis ์๋ํฌ์ธํธ๋ฅผ ์ฌ์ฉํ๋ ์์คํ ์์, replica ์๋ํฌ์ธํธ๋ฅผ ์ถ๊ฐํ๊ฒ ๋๋ฉด์ ์ด 2๊ฐ์ endpoint ๋ฅผ ์ฐ๊ฒ ๋๋ค. Redis ์ค์ ๊ฐ์ ์ด๊ธฐํ ํ ๋ ์ด endpoint ๊ฐ์ ์ฃผ์ ์ ellipsis ๋ฅผ ์ฌ์ฉํ ์ ์์๋ค. ๊ธฐ์กด ์ฝ๋์์๋ ํ๋์ endpoint ๋ง ๋ฐ์ง๋ง, ๊ฐ์ ๋ ์ฝ๋์์๋ string ์ ellipsis ๋ก ๋ฐ์ 2๊ฐ ์ด์์ endpoint ๋ ์ธ์๋ก ๋ฐ์ ์ ์๊ฒ ๋๋ค.
// ๊ธฐ์กด
func mustConnectRedis(endpoint string) redis.UniversalClient {
...
redisClient := redis.NewUniversalClient(&redis.UniversalOptions{
Addrs: endpoint,
ReadOnly: true,
})
}
mustConnectRedis("127.0.0.1:6379")
// ์ฌ๋ผ์ด์ค ํ์ฅํ๋๋ก ๊ฐ์
func mustConnectRedis(endpoint ...string) redis.UniversalClient {
...
redisClient := redis.NewUniversalClient(&redis.UniversalOptions{
Addrs: endpoint,
ReadOnly: true,
})
}
mustConnectRedis("127.0.0.1:6379", "127.0.0.1:6380")
์ฃผ์์ฌํญ๊ณผ ํ
1. ๊ฐ๋ณ์ธ์๋ ํญ์ ํจ์ ๋ง์ง๋ง ๋งค๊ฐ๋ณ์์ฌ์ผ ํ๋ค.
// ์ฌ๋ฐ๋ฅธ ์ฌ์ฉ
func correct(prefix string, numbers ...int)
// ์๋ชป๋ ์ฌ์ฉ
func incorrect(numbers ...int, prefix string) // ์ปดํ์ผ ์๋ฌ
2. ํ์ ์์ ์ฑ ์ ์ง
func betterFunction(numbers ...int) // interface{} ๋์ ๊ตฌ์ฒด์ ์ธ ํ์
์ฌ์ฉ ๊ถ์ฅ
func avoidThis(args ...interface{}) // ๊ฐ๋ฅํ๋ฉด ํผํ ๊ฒ
3. ์์ ๋ฐ์ดํฐ ์ ์์ ์ฌ์ฉ ๊ถ์ฅ
๊ฐ๋ ์ฑ ์ธก๋ฉด์์ ํฐ ์ฅ์ ์ ๋ณด์ด๋ ellipsis ์ง๋ง ์ฑ๋ฅ ์ธก๋ฉด๋ ๊ณ ๋ คํด์ผ ํ๋ค.
ellipsis ๋ฅผ ์ฌ์ฉํ๋ฉด ๋ด๋ถ์ ์ผ๋ก ์ฌ๋ผ์ด์ค๊ฐ ์์ฑ๋๋ฏ๋ก ๋งค์ฐ ํฐ ๋ฐ์ดํฐ ์ ์ ๋ค๋ฃฐ ๋๋ ์ง์ ์ฌ๋ผ์ด์ค๋ฅผ ์ ๋ฌํ๋ ๊ฒ์ด ๋ ํจ์จ์ ์ด๊ธฐ ๋๋ฌธ์ด๋ค. ์๋ ์ฝ๋๋ฅผ ๋ณด๋ฉฐ ์์ธํ ์์๋ณด์.
func sum(numbers ...int) int {
// numbers๋ ๋ด๋ถ์ ์ผ๋ก ์ฌ๋ผ์ด์ค๋ก ๋ณํ๋จ
total := 0
for _, num := range numbers {
total += num
}
return total
}
// ํธ์ถ ์
sum(1, 2, 3)
sum() ์ด ์คํ๋ ๋ ๋ด๋ถ์ ์ผ๋ก ์ผ์ด๋๋ ์ผ์ ์ ๋ฆฌํ๋ฉด,
1. ์๋ก์ด ์ฌ๋ผ์ด์ค๊ฐ ์์ฑ๋จ
2. ์ธ์๋ค (1,2,3)์ด ์ฌ๋ผ์ด์ค๋ก ๋ณต์ฌ๋จ
3. ํจ์ ๋ด๋ถ์์ ์ฌ๋ผ์ด์ค๋ฅผ ์ฌ์ฉํจ.
์ ์์์ฒ๋ผ ์ ์ ์์ ์ธ์๊ฐ ์ฌ๋ผ์ด์ค๋ก ๋ณต์ฌ๋์ด๋ ์ฑ๋ฅ ์ฐจ์ด๋ ๊ฑฐ์ ๋ฐ์ํ์ง ์์ ๊ฑฐ๋ผ ์๊ฐํ๋ค. ํ์ง๋ง ๋ง์ฝ ํฌ๊ธฐ๊ฐ (์ค๋ฒํด์) 100๋ง์ธ ์ฌ๋ผ์ด์ค๋ฅผ ์ด๊ธฐํํ์ฌ ellipsis ๋ก ๋๊ธด๋ค๊ณ ๊ฐ์ ํด๋ณด์.
์ผ์ด์ค 1 ์ฒ๋ผ ์ฌ๋ผ์ด์ค๋ฅผ ํ์ฅํ๋ฉด sumVariadic() ๋ด๋ถ์์ ํฌ๊ธฐ๊ฐ 100๋ง์ธ ์ฌ๋ผ์ด์ค๊ฐ ์๋ก ์์ฑ๋์ด ๋ณต์ฌ๋๋ฉฐ ์ด๋ฌํ ์์ ์ด ๋ฐ๋ณต๋๋ฉด ์ฌ๊ฐํ ๋ฉ๋ชจ๋ฆฌ ๋ฌธ์ ๋ฅผ ์ด๋ํ ์ ์๋ค.
๋๋ฌธ์ ๋ฐ์ดํฐ ์ ์ด ๋๋ฌด ์ปค์ง ๊ฒ ๊ฐ์ ๋ ellipsis ๋ฅผ ์ฌ์ฉํ๊ธฐ ๋ณด๋ค ์ผ์ด์ค 2 ์ฒ๋ผ ๊ธฐ์กด ์ฌ๋ผ์ด์ค๋ฅผ ์ง์ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ฉ๋ชจ๋ฆฌ ์ธก๋ฉด์์ ํจ์จ์ ์ด๋ผ ์๊ฐํ๋ค.
numbers := make([]int, 1000000)
// ์ผ์ด์ค 1: ์ถ๊ฐ์ ์ธ ์ฌ๋ผ์ด์ค ์์ฑ ๋ฐ ๋ณต์ฌ ๋ฐ์
sumVariadic(numbers...)
// ์ผ์ด์ค 2: ๊ธฐ์กด ์ฌ๋ผ์ด์ค ์ง์ ์ฌ์ฉ (์ถ๊ฐ ๋ฉ๋ชจ๋ฆฌ ํ ๋น ์์)
sumSlice(numbers)
์ ๋ฆฌํ๋ฉด
ellipsis ๋ฅผ ์ฌ์ฉํ๋ ์ด์ ๋ ์ฝ๋ ์ ์ฐ์ฑ๊ณผ ์ฌ์ฌ์ฉ์ฑ์ ํฅ์์ํฌ ์ ์๋ค. ํจ์ ํธ์ถ ์ ๋ ๊น๋ํ๊ณ ์ง๊ด์ ์ธ ๋ฌธ๋ฒ์ ์ฌ์ฉํ์ฌ ๊ฐ๋ ์ฑ์ ๋์ผ ์ ์๊ณ , ๋งค๊ฐ๋ณ์ ๊ฐ์์ ์ ์ฐ์ฑ๋ ๋์ด๋ ์ฅ์ ์ ๋ ธ๋ฆด ์ ์๋ค. ๋จ ์ฌ๋ผ์ด์ค๋ฅผ ํ์ฅํ๋ฉด ํจ์ ๋ด๋ถ์์ ํด๋น ์ฌ๋ผ์ด์ค ํฌ๊ธฐ๋งํผ ์๋ก์ด ์ฌ๋ผ์ด์ค๋ฅผ ์์ฑํ๊ณ ๋ณต์ฌํ๋ ์์ ์ด ๋ฐ์ํ ์ ์๋ค. ๋๋ฌธ์ ํฌ๊ธฐ๊ฐ ํฐ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๋ผ๋ฉด ๋ฉ๋ชจ๋ฆฌ ์ธก๋ฉด๋ ๊ณ ๋ คํ์ฌ ellipsis ๋ฅผ ์ ์ ํ ์ฌ์ฉํ๋ ๊ฒ์ ๊ถ์ฅํ๋ค.