클로저

최승훈·2020년 8월 9일
0

Golang기초

목록 보기
3/7
post-thumbnail

클로저란?

함수 안에서 익명 함수를 정의해서 해당 익명함수의 바깥쪽 함수에 선언한 변수에도 접근할 수 있는 함수를 의미.

함수안에서 바깥쪽 변수를 하용하기 위해서는, 매개변수를 이용해 Pass by Vaule형식 또는 Pass by Reference형식으로 사용해야함.

하지만 익명함수는 클로저이기 때문에 외부 함수의 변수를 그냥 접근 할 수 있음.

package main

import "fmt"

func main() {

	num1 , num2 := 3, 4
	name := "show"

	result := func() int{
		return num1 + num2 // main의 num1, num2변수에 접근가능
	}()

	fmt.Println(result)

	func() {
		fmt.Println(name) // main의 name변수에 접근가능
	}()
}

함수 안에서 함수를 정의하기 위해서는 당연히 익명함수만을 쓸 수 있음.

함수 안에서 함수를 반환 받는 예제

package main

import "fmt"

func next() func() int {
	i := 0
	return func() int {
		i += 1
		return i
	}
}

func main() {
	nextInt := next()

	fmt.Println(nextInt())
	fmt.Println(nextInt())
	fmt.Println(nextInt())
	fmt.Println(nextInt())

	newInt := next()
	fmt.Println(newInt())
	fmt.Println(nextInt())
}

nextInt를 실행시킬때마다 i의 값이 초기화 되는 것이 아니라 이전의 흐름에 이어서 1을 증가시킴.

i의 연산기능을 하는 익명함수 안에서 i가 선언된게 아닌, 익명 함수 밖에있는 변수 i를 참조하고 있기 때문.
익명 함수 자체가 i를 갖는 것이 아닌, 외부 변수 i가 상태를 계속 유지하면서 값을 1씩 증가 시킴.

새로운 변수인 newInt에 새롭게 함수를 초기화 하면 새로운 클로저 함수 값을 생성해 변수i는 다시 0으로 초기화 되지만, nextInt의 i값에는 영향이 없음.

참조: https://edu.goorm.io/learn/lecture/2010/%ED%95%9C-%EB%88%88%EC%97%90-%EB%81%9D%EB%82%B4%EB%8A%94-%EA%B3%A0%EB%9E%AD-%EA%B8%B0%EC%B4%88/lesson/81717/%EC%99%B8%EB%B6%80-%EB%B3%80%EC%88%98-%EC%A0%91%EA%B7%BC-%ED%81%B4%EB%A1%9C%EC%A0%80

profile
안녕하세요

0개의 댓글