[go] Go 언어에서 내부 함수

Go 언어는 강력하고 유연한 내부 함수 지원을 제공합니다. 내부 함수는 다른 함수 내에서 정의되는 함수로서, 해당 함수 내에서만 사용 가능한 함수입니다. 이러한 내부 함수는 코드의 모듈성과 가독성을 높이는 데 도움이 됩니다. 이번 블로그 포스트에서는 Go 언어에서 내부 함수를 사용하는 방법에 대해 알아보겠습니다.

내부 함수 정의하기

내부 함수는 다른 함수 내에서 정의되므로, 함수 내부에 직접 작성할 수 있습니다. 아래는 내부 함수를 정의하는 예시입니다.

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

    result := add(2, 3)
    fmt.Println(result) // 출력: 5
}

위 코드에서 add라는 내부 함수를 main 함수 내에 정의하였습니다. 이 내부 함수는 ab라는 두 개의 정수를 입력으로 받아서 더한 결과를 반환합니다.

내부 함수의 사용

내부 함수는 정의된 함수 내에서만 사용할 수 있기 때문에, 해당 함수 내에서만 호출할 수 있습니다. 다음은 내부 함수를 사용하는 예시입니다.

func calculateSquareAndCube(x int) (int, int) {
    square := func(n int) int {
        return n * n
    }

    cube := func(n int) int {
        return n * n * n
    }

    return square(x), cube(x)
}

func main() {
    square, cube := calculateSquareAndCube(5)
    fmt.Println("Square:", square) // 출력: Square: 25
    fmt.Println("Cube:", cube)     // 출력: Cube: 125
}

위 코드에서 calculateSquareAndCube 함수 내에서 squarecube라는 두 개의 내부 함수를 정의하였습니다. 이렇게 정의된 내부 함수는 calculateSquareAndCube 함수 내에서만 호출할 수 있습니다. main 함수에서 calculateSquareAndCube 함수를 호출하여 squarecube 값을 얻을 수 있습니다.

내부 함수의 활용

내부 함수는 주로 클로저(closure)를 구현하는 데 활용됩니다. 클로저란 함수와 그 함수가 참조하는 비지역 변수의 조합입니다. 아래는 클로저를 구현한 예시입니다.

func getCounter() func() int {
    count := 0

    increment := func() int {
        count++
        return count
    }

    return increment
}

func main() {
    counter := getCounter()

    fmt.Println(counter()) // 출력: 1
    fmt.Println(counter()) // 출력: 2
    fmt.Println(counter()) // 출력: 3
}

위 코드에서 getCounter 함수는 내부 함수 increment를 반환합니다. increment 함수는 count라는 비지역 변수를 참조하여 값을 증가시키고 반환합니다. 이를 통해 counter에는 각 호출마다 1씩 증가하는 값을 반환하는 클로저가 할당됩니다.

결론

Go 언어에서 내부 함수는 다른 함수 내에서 정의되는 유용한 기능입니다. 내부 함수는 모듈성을 높이고 코드를 더 읽기 쉽게 만드는 데 도움이 됩니다. 위에서 소개한 내부 함수 정의와 활용 예시를 참고하여 적절히 활용해보세요.

참고: The Go Programming Language Specification - Function declarations