클로저란?
클로저는 함수 안에 만들어진 익명 함수로서, 익명 함수 외부에 있는 변수까지 접근이 가능한 함수이다.
클로져가 뭔지 예제를 통해 살펴보겠습니다.
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을 많이 사용해보신 분이 있다면 알려주시면 감사하겠습니다. __