클로저란?
클로저는 더 가까이란 뜻의 Closer가 아니라 닫힘을 의미하는 Closure이다. 일반적으로 함수 외부에서 작성된 데이터를 함수에서 사용하기 위해서는 매개변수를 사용하여 받은 값을 수정한 후 이를 리턴하는 방식을 사용한다. 하지만 이 클로저라는 기법을 사용한다면 함수 외부에서 작성된 지역변수를 함수 내에서 마음대로 접근하는 것이 가능해 진다.
예시
간단한 코드를 통해 알아보는 것이 가장 확실한 방법이 아닐까 한다.
func main() {
val := 0
f := func() {
val++
}
f()
fmt.Println((val))
}
결과 : 1
생성기란?
하나의 분리된 캡슐화된 객체를 생성하는 패턴이라 생각할 수 있다.
클로저를 이용한 생성기
코드
import "fmt"
func generator() func() int {
var val int
return func() int {
val++
return val
}
}
func main() {
gen1 := generator()
gen2 := generator()
fmt.Print(gen1(), gen1(), gen1(), gen2(), gen2(), gen1(), gen2())
}
결과 : 1 2 3 1 2 4 3
코드 설명
generator은 함수를 반환하는 함수이다. 또한 val이라는 int type의 변수를 가진 클로저 함수를 반환한다.
gen1과 gen2 변수에 generator 함수를 담아 놓은 것을 볼 수 있다. 객체는 서로 분리된 val값을 가진다.
실행 결과를 살펴보자.
gen1을 실행하게 된다면 gen1이 가진 val 값을 리턴하기에 실행할 때 마다 하나씩 증가된 값을 볼 수 있다.
또한 gen1과 gen2는 다른 객체기에 가진 val 값은 분리되어있다.
그렇기에 실행 결과는 1 2 3 1 2 4 3 임을 확인할 수 있다.
마무리
차근차근 다시!
'Study > Go' 카테고리의 다른 글
[Go] Go의 메모리 할당 (0) | 2022.04.08 |
---|---|
[Go] Heap 자료구조를 사용하는 우선순위 큐 (Priority Queue) (0) | 2021.10.04 |
[Go] 고루틴(Goroutine) 알고쓰기(2) - Block 처리방식, Channel (0) | 2021.09.17 |
[Go] 고루틴(Goroutine) 알고쓰기(1) - 동시성, 병렬성 프로그래밍 그리고 고루틴 (0) | 2021.09.01 |
[Go] Json 활용 방법 (0) | 2021.08.12 |