클로저(Closure)는 함수 안에서 함수를 선언 및 정의할 수 있고, 바깥쪽 함수에 선언된 변수에도 접근할 수 있는 함수를 말한다. 내부에 있는 함수의 입장에서 보았을 때 바깥 함수가 변수와 자기 자신(함수)을 에워싸고(close over) 있다고 해서 Closure라고 한다.
func main() {
a, b := 5, 10
f := func(x int) int { // main 함수내에 함수 f 정의
return a\*x + b // a, b는 f 외부에서 정의된 변수
}
fmt.Println(f(2)) // 20
}
언뜻 보기에는 필요 없어 보일 수 있겠지만, 같은 지역변수를 계속해서 사용하고 싶을 때 유용하다.
지역변수는 함수 실행이 끝나면 소멸된다. 하지만 클로저에서 선언한 지역변수는 함수를 호출할 때마다 계속 가져다 쓸 수 있다. 즉 함수가 선언될 때의 환경을 계속 유지할 수 있다.
func calcArea() func(radius float64) float64 { // 리턴이 익명함수
pi := 3.14
return func(radius float64) float64 {
return radius \* radius \* pi
}
}
func main() {
f := calcArea() // f에는 calcArea 함수를 실행하여 리턴값으로 나온 클로저가 저장됨
fmt.Println(f(3)) // 28.26
}
아래의 예제에서 출력된 결과를 보면 "Hi Kinder", "Hi Godiva"라는 문자열들이 변화하고 있는 것처럼 보인다. 하지만 실제로는 이 문자열들은 각각의 환경에서 생성된 것이므로 여러번 생성된 값이다.
func hi(msg string) func() string {
return func() string {
return "Hi " + msg
}
}
func main() {
f1 := hi("Kinder")
f2 := hi("Godiva")
fmt.Println(f1()) // Hi Kinder
fmt.Println(f2()) // Hi Godiva
}
'Language > Golang' 카테고리의 다른 글
Golang panic(패닉)과 recover(복구): Java에서의 try-catch 구문 (0) | 2019.09.10 |
---|---|
Golang defer (지연 호출) (0) | 2019.09.07 |
Golang first-class function (일급함수) (0) | 2019.09.03 |
Golang 함수 (0) | 2019.09.03 |
댓글