본문 바로가기
Language/Golang

Golang Closure

by 돈코츠라멘 2019. 9. 6.

클로저(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
}

댓글