๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด/Go

[Go] ํ•จ์ˆ˜ ๊ณ ๊ธ‰(๊ฐ€๋ณ€ ์ธ์ˆ˜, defer, ๋žŒ๋‹คํ•จ์ˆ˜, ํ•จ์ˆ˜ํƒ€์ž… ๋ณ€์ˆ˜)

by ์„œ์•„๋ž‘๐Ÿ˜ƒ 2025. 9. 19.

 

 

๋“ค์–ด๊ฐ€๋ฉฐ

Modern Go ๊ธฐ๋ณธ ํŽธ์—์„œ ํ•จ์ˆ˜๋ฅผ ๋‹ค๋ค˜์ง€๋งŒ, ์ด๊ฑธ๋กœ๋Š” ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค. Go์—์„œ๋Š” ๋”์šฑ ๊ฐ•๋ ฅํ•œ ํ•จ์ˆ˜ ๊ธฐ๋Šฅ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ„๋‹จํ•˜๊ฒŒ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. 

 


1. ๊ฐ€๋ณ€ ์ธ์ˆ˜ ํ•จ์ˆ˜ (Variadic Function)

  • ํ•จ์ˆ˜์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๊ฐœ์ˆ˜ ์ œํ•œ ์—†์ด ๋ฐ›์„ ์ˆ˜ ์žˆ์Œ.
  • ...ํƒ€์ž… ํ˜•์‹์œผ๋กœ ์ •์˜.
  • ๋‚ด๋ถ€์ ์œผ๋กœ๋Š” slice๋กœ ์ฒ˜๋ฆฌ๋จ.
package main

import "fmt"

func sum(nums ...int) int {
    total := 0
    for _, n := range nums {
        total += n
    }
    return total
}

func main() {
    fmt.Println(sum(1, 2))          // 3
    fmt.Println(sum(1, 2, 3, 4, 5)) // 15
}

2. defer ์ง€์—ฐ ์‹คํ–‰

  • ํ•จ์ˆ˜๊ฐ€ ๋ฆฌํ„ด๋˜๊ธฐ ์ง์ „์— ์‹คํ–‰๋จ.
  • ๋ณดํ†ต ๋ฆฌ์†Œ์Šค ํ•ด์ œ, ํŒŒ์ผ ๋‹ซ๊ธฐ, unlock ๋“ฑ์— ์‚ฌ์šฉ.
  • defer๋Š” ์Šคํƒ์ฒ˜๋Ÿผ ๋™์ž‘ → ๋‚˜์ค‘์— ๋“ฑ๋ก๋œ ๊ฒƒ์ด ๋จผ์ € ์‹คํ–‰๋จ (LIFO).
package main

import "fmt"

func main() {
    defer fmt.Println("๋งˆ์ง€๋ง‰ ์‹คํ–‰๋จ")
    defer fmt.Println("์ด๊ฒƒ๋„ ์ง€์—ฐ ์‹คํ–‰๋จ")

    fmt.Println("๋ฉ”์ธ ํ•จ์ˆ˜ ์‹œ์ž‘")
}

์ถœ๋ ฅ:

๋ฉ”์ธ ํ•จ์ˆ˜ ์‹œ์ž‘
์ด๊ฒƒ๋„ ์ง€์—ฐ ์‹คํ–‰๋จ
๋งˆ์ง€๋ง‰ ์‹คํ–‰๋จ

 ๋ณดํ†ต ํ•จ์ˆ˜ ์ˆ˜๋ช… ์ฃผ๊ธฐ ๋‚ด์—์„œ ๋๋‚ด์•ผ ํ•˜๋Š” ์ž‘์—…์„ defer๋กœ ํ™œ์šฉ. File close, Mutex ์ž ๊ธˆ ํ•ด์ œ ๋“ฑ ์ฒ˜๋Ÿผ ๋ฆฌ์†Œ์Šค๋ฅผ ์ •๋ฆฌํ•˜๋Š” ๋ฐ ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉ๋จ.

func writeLog(w io.Writer, message string) {
    fmt.Fprintf(w, "[Log] %s\n", message)
}

func main() {
    f, _ := os.Create("app.log")
    defer f.Close()

    writeLog(f, "File log")        // ํŒŒ์ผ์— ์ถœ๋ ฅ
    writeLog(os.Stdout, "Console") // ์ฝ˜์†”์— ์ถœ๋ ฅ
}

 


3. ํ•จ์ˆ˜ ํƒ€์ž… ๋ณ€์ˆ˜ (Function Type Variable)

  • ํ•จ์ˆ˜๋„ ๋ณ€์ˆ˜์— ๋‹ด์„ ์ˆ˜ ์žˆ๊ณ , ์ธ์ž/๋ฆฌํ„ด์œผ๋กœ ์ฃผ๊ณ ๋ฐ›์„ ์ˆ˜ ์žˆ์Œ.
package main

import "fmt"

func add(a, b int) int {
    return a + b
}

func main() {
    // ํ•จ์ˆ˜ ํƒ€์ž… ๋ณ€์ˆ˜
    var op func(int, int) int
    op = add

    fmt.Println(op(3, 4)) // 7
}

4. ํ•จ์ˆ˜ ๋ฆฌํ„ฐ๋Ÿด (Function Literal, ์ต๋ช… ํ•จ์ˆ˜)

  • ์ด๋ฆ„์ด ์—†๋Š” ํ•จ์ˆ˜ ์ •์˜ ๋ฐฉ์‹.
  • ๋ณดํ†ต ํ•จ์ˆ˜ ๋ณ€์ˆ˜์— ๋ฐ”๋กœ ๋Œ€์ž…ํ•˜๊ฑฐ๋‚˜ ์ฆ‰์‹œ ์‹คํ–‰.
  • ํด๋กœ์ €(closure)๋„ ์ง€์› → ์™ธ๋ถ€ ๋ณ€์ˆ˜ ์บก์ฒ˜ ๊ฐ€๋Šฅ.
package main

import "fmt"

func main() {
    // ๋ณ€์ˆ˜์— ๋‹ด์•„์„œ ์‚ฌ์šฉ
    mul := func(a, b int) int {
        return a * b
    }
    fmt.Println(mul(3, 4)) // 12

    // ์ฆ‰์‹œ ์‹คํ–‰ ํ•จ์ˆ˜
    result := func(msg string) string {
        return "Hello " + msg
    }("Go")
    fmt.Println(result) // Hello Go

    // ํด๋กœ์ € ์˜ˆ์‹œ
    counter := 0
    inc := func() int {
        counter++
        return counter
    }
    fmt.Println(inc()) // 1
    fmt.Println(inc()) // 2
}

๋Œ“๊ธ€