[ Golang을 배워보자! ] A Tour of Go - 43 함수 클로져 (Function closures)

in #golang7 years ago (edited)

클로저란?

클로저는 함수 안에 만들어진 익명 함수로서, 익명 함수 외부에 있는 변수까지 접근이 가능한 함수이다.

클로져가 뭔지 예제를 통해 살펴보겠습니다.

func main() {
    x := 0
    increment := func() int {
        x++
        return x
    }
    fmt.Println(increment())
    fmt.Println(increment())
}

이와 같이 작성할 경우

1
2

가 출력됩니다.

그렇다면 이번엔 A Tour of Go 43번 예제를 보겠습니다.

func adder() func(int) int {
    sum := 0
    return func(x int) int {
        sum += x
        return sum
    }
}

func main() {
    pos, neg := adder(), adder()
    for i := 0; i < 5; i++ {
        fmt.Println(
            pos(i), // 
            neg(-2*i),
        )
    }
}

출력 결과는

0 0
1 -2
3 -6
6 -12
10 -20

이와같이 출력되지요.

43번 문제에는 다음과 같이 써 있습니다.

각각의 클로져는 자신만의 sum 변수를 가집니다.
라고 말이죠.
그래서 pos 와 neg는 sum 변수를 공유하지 않았던 겁니다.

근데 여기서 의문이 생겼습니다. 제가 처음 작성했던 예제에서

func main() {
    x := 0
    increment := func() int {
        x++
        return x
    }
    increment_2 := func() int {
        x += 2
        return x
    }
    fmt.Println(increment())
    fmt.Println(increment_2())
}

이렇게 작성하면 어떻게 될까?

1
3

결과는 위와 같이 출력됩니다.

이번에는 변수를 공유하는 결과가 나왔네요.

단순히 익명함수 밖의 변수를 접근한다고 해서 클로저가 아닌걸까요?
main함수가 아닌 다른 함수 내부에서 익명함수가 사용되어져야 클로져인걸까요?

사실 아직 잘 모르겠습니다 ㅎㅎ;;

여러곳을 찾아보았지만, 클로져에 대해 자세한 내용을 찾기 힘드네요.

golang을 많이 사용해보신 분이 있다면 알려주시면 감사하겠습니다. __