본문 바로가기
Study/Go

[Go] 클로저(Closure)를 활용하여 생성기(generator) 제작

by _royJang 2021. 10. 2.

클로저란?

클로저는 더 가까이란 뜻의 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 임을 확인할 수 있다.

마무리

차근차근 다시!