Go 언어의 클로저(Closure) 프로그래밍

클로저란 단순한 익명 함수와 혼동돼서는 안 되는데 함수의 인스탄스로서 그 비-지역(non-local) 변수가 인스탄스의 변수에 결합되게 됩니다 또다른 설명으로는 자체적인 환경을 가진 함수를 뜻하는데 최소 한 개의 결합 변수(bound variable) 를 가지며 이들 변수는 초기화되지 않고 호출될 때 그 전 상태를 유지합니다

go 언어(golang)에서 클로저란 일반 함수 내부에 정의된 익명의 내장 함수를 이용하여 자체적인 변수를 가질 수도 있고 내장 함수 밖의 변수를 취할 수도 있습니다 말로써 설명하기는 쉽지 않으니 예를 들자면, 내장 함수를 일반 함수의 리턴 값으로 사용한다면,  아래와 같이...


package main


import "fmt"


func adder() func(int) int {

sum := 0

return func(x int) int {   // 익명 함수 A

sum += x

return sum

}

}


// 함수 adder()는 리턴값으로 익명 함수  A를 갖는데, 

// 이 익명 함수는 인수 이외의 변수는 런타임이 아니라 정적이고 폐쇄된 환경에서 취하는 게 됩니다 


func main() {

pos := adder() // 이런 식으로 선언되면

      // adder() 가 다음 라인에서 메모리에서 소멸되더라도

      // sum은 0의 값으로 남아 있으며  

for i := 0; i < 10; i++ {

fmt.Println(pos(i))

           // pos는 adder 자체가 아니라 그 내부의 익명 함수로서 

           // sum 은 당연히 0으로 초기화되지 않고 sum+i 의 값이 저장됩니다  

}

}


결과값은

0

1

3

6

10

15

식으로 출력됩니다  


지역 변수가 소멸되지 않고 전역 변수처럼 함수를 호출할 때마다 가져다 쓸 수 있다는 게 장점의 하나라는데... 하여튼 여기까지가 golang의 클로저를 대충 이해한 것입니다 전역 변수를 사용할 필요도 없고 뭔가 깔끔한 프로그래밍이 될 듯도 하군요 이 밖에도 몇가지 용도가 있습니다 




덧글

댓글 입력 영역