클로저
클로저에 대해 알아보자.
외부 변수 접근 : 클로저
이전 챕터에서 배운 함수는 자체를 다른 객체들과 마찬가지로 함수형으로서 매개변수와 반환값으로 쓸 수 있는 것입니다. 그렇기에 익명함수를 사용할 수 있으며 이것은 Go언어에서 함수는 일급 함수였기 때문입니다.
클로저는 함수 안에서 익명 함수를 정의
해서 바깥쪽 함수에 선언한 변수에도 접근할 수 있는 함수
를 말합니다.
쉽게 말해서, 익명 함수는 클로저이기 때문에 외부 함수의 변수를 매개변수 없이 그냥 접근
할 수 있습니다. 주로 원하는 처리가 있는데 재료(변수)에 따라 다르게하고 싶거나 변수를 고정할때 사용
됩니다.
package main
import "fmt"
func next() func() int {
i := 0
return func() int {
i += 1
return i
}
}
func main() {
nextInt := next()
fmt.Println(nextInt())
fmt.Println(nextInt())
fmt.Println(nextInt())
newInt := next()
fmt.Println(newInt())
}
함수 안에서 함수를 정의하기 위해서 당연히 익명 함수만 쓸 수 있습니다.
지난 챕터에서 함수 자체를 매개변수로 전달
받는 것은 배웠는데 이번 챕터인 ‘클로저’는 함수 안에서 함수를 반환
하는 것 입니다.
위 코드를 설명하자면, i의 연산 기능을 하는 익명 함수 안에서 i가 선언되지 않고 익명 함수 밖에 있는 변수 i를 참조하고 있습니다. 익명 함수 자체가 지역 변수로 i를 갖는 것이 아니기 때문에 외부 변수 i가 상태를 계속 유지하면서 값을 1씩 증가시키는 기능을 하게 됩니다. 그리고 새로운 변수인 newInt에 새롭게 함수를 초기화하면 새로운 클로저 함수 값을 생성해 변수 i는 다시 0으로 초기화됩니다.