[Go] Ellipsis ์˜ ํ™œ์šฉ๊ณผ ์ฃผ์˜์‚ฌํ•ญ

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 ๋ฅผ ์ ์ ˆํžˆ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•œ๋‹ค.