[go] Go 언어에서 익명 함수를 사용한 재귀 호출

Go 언어는 다양한 함수 형태를 지원하는데, 그 중에 익명 함수(Anonymous Function)가 있습니다. 익명 함수는 이름이 없는 함수로, 코드 내에서 인라인으로 선언하고 사용할 수 있습니다. 이번 글에서는 Go 언어에서 익명 함수를 활용하여 재귀 호출을 구현하는 방법에 대해 알아보겠습니다.

익명 함수란?

익명 함수는 이름이 없는 함수로서, 함수를 변수에 할당하거나 다른 함수의 인자로 사용할 때 주로 활용됩니다. Go 언어에서는 함수 선언 형태와 유사하게 구현할 수 있습니다. 다음은 익명 함수의 기본 형태입니다.

func() {
    // 함수 내용
}

익명 함수는 위와 같이 func 키워드를 사용하여 정의합니다. 함수 내용은 중괄호({}) 안에 작성됩니다.

익명 함수를 사용한 재귀 호출

익명 함수를 활용하여 재귀 호출을 구현하기 위해서는 다음과 같은 방법을 사용할 수 있습니다.

  1. 익명 함수를 재귀 호출할 코드 내부에서 정의합니다.
  2. 재귀 호출을 종료할 조건을 명시합니다.
  3. 재귀 호출을 수행하는 부분을 익명 함수 내에 작성합니다.

다음은 익명 함수를 사용하여 팩토리얼을 계산하는 예제입니다.

package main

import "fmt"

func main() {
    n := 5
    result := func(x int) int {
        if x == 1 {
            return 1
        }
        return x * result(x-1)
    }(n)

    fmt.Println(result)
}

위 예제에서는 main 함수 내에서 익명 함수를 정의하고 호출하는 방식으로 재귀 호출을 구현했습니다. result 변수에 재귀 호출 결과를 저장하고, 이를 출력합니다.

익명 함수와 클로저

Go 언어의 익명 함수는 클로저(Closure)를 구현하기에 적합합니다. 클로저는 함수와 그 함수가 참조하는 환경(변수 등)을 하나로 묶어서 사용하는 개념입니다. 익명 함수를 클로저로 사용하면, 함수 내부에서 외부 변수를 사용하거나 변경할 수 있습니다.

다음은 클로저를 사용하여 카운터를 구현하는 예제입니다.

package main

import "fmt"

func main() {
    counter := func() func() int {
        count := 0
        return func() int {
            count++
            return count
        }
    }()

    fmt.Println(counter()) // 1
    fmt.Println(counter()) // 2
    fmt.Println(counter()) // 3
}

위 예제에서는 counter 함수 내에서 count 변수를 정의하고, 이를 참조하여 카운터를 증가시키고 반환하는 익명 함수를 반환합니다. counter 함수를 호출하면, 반환된 익명 함수가 실행되어 카운터가 증가합니다.

결론

Go 언어에서 익명 함수를 사용하여 재귀 호출을 구현할 수 있습니다. 익명 함수는 코드 내에서 인라인으로 정의하고 사용할 수 있는 강력한 기능이며, 클로저와 함께 사용하면 더욱 다양한 기능을 구현할 수 있습니다.