[go] Go 언어에서 클로저(closure)

클로저란 프로그래밍 언어에서 매우 강력한 개념 중 하나입니다. 클로저는 함수와 그 함수가 참조하는 변수들로 구성된 패키지입니다. 이 패키지는 함수가 정의된 범위를 벗어난 후에도 함수가 참조하는 변수들을 계속해서 접근할 수 있도록 합니다. Go 언어에서도 클로저를 사용할 수 있으며, 다양한 상황에서 유용하게 활용될 수 있습니다.

클로저의 기본 구조

Go 언어에서는 클로저를 선언하는 방법이 간단합니다. 클로저는 함수 리터럴과 변수를 조합하여 생성됩니다. 이렇게 생성된 클로저는 해당 함수가 선언된 범위에서 사용된 변수를 계속해서 참조할 수 있습니다. 예를 들어, 다음과 같이 클로저를 선언할 수 있습니다.

func main() {
    num := 10

    add := func(value int) int {
        return value + num
    }

    result := add(5)
    fmt.Println(result) // Output: 15
}

위의 예제에서 add 함수는 num 변수를 참조하고 있습니다. add 함수는 선언된 범위인 main 함수 내에서 사용되지만, main 함수가 종료된 후에도 add 함수는 num 변수를 참조할 수 있습니다.

클로저의 활용

클로저는 다양한 상황에서 유용하게 활용될 수 있습니다.

상태 정보 유지

클로저를 사용하면 함수가 호출될 때마다 상태 정보를 유지할 수 있습니다. 예를 들어, 다음과 같이 클로저를 사용하여 카운터를 구현할 수 있습니다.

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

    return func() int {
        count += 1
        return count
    }
}

func main() {
    c := counter()
    fmt.Println(c()) // Output: 1
    fmt.Println(c()) // Output: 2
    fmt.Println(c()) // Output: 3
}

위의 예제에서 counter 함수는 count 변수를 참조하는 클로저를 반환합니다. 이 클로저를 사용하면 호출될 때마다 count 변수의 값을 증가시킬 수 있습니다.

함수 팩토리

클로저를 사용하면 동일한 동작을 수행하는 여러 개의 함수를 생성할 수 있습니다. 예를 들어, 다음과 같이 클로저를 사용하여 덧셈, 뺄셈, 곱셈, 나눗셈 함수를 생성할 수 있습니다.

func calculate(operator string) func(int, int) int {
    switch operator {
    case "+":
        return func(a, b int) int { return a + b }
    case "-":
        return func(a, b int) int { return a - b }
    case "*":
        return func(a, b int) int { return a * b }
    case "/":
        return func(a, b int) int { return a / b }
    default:
        return nil
    }
}

func main() {
    add := calculate("+")
    fmt.Println(add(3, 4)) // Output: 7

    subtract := calculate("-")
    fmt.Println(subtract(10, 5)) // Output: 5

    multiply := calculate("*")
    fmt.Println(multiply(3, 4)) // Output: 12

    divide := calculate("/")
    fmt.Println(divide(10, 2)) // Output: 5
}

위의 예제에서 calculate 함수는 주어진 연산자에 따라 해당 연산을 수행하는 클로저를 반환합니다. 이 클로저를 사용하여 다양한 연산을 수행할 수 있습니다.

결론

Go 언어에서 클로저를 사용하면 함수와 변수들로 구성된 패키지를 만들 수 있습니다. 클로저를 사용하면 함수가 선언된 범위를 벗어난 후에도 변수를 계속해서 참조할 수 있으며, 이를 통해 다양한 상황에서 유용하게 활용할 수 있습니다. 클로저를 잘 활용하면 코드의 가독성과 유연성을 크게 향상시킬 수 있습니다.


References