🔥 함수 클로저

341자
4분

Go 언어에서는 함수가 클로저(closure)가 될 수 있어요. 클로저는 자신의 몸체 외부에서 참조하는 변수를 가질 수 있는 함수 값이에요. 함수는 참조된 변수에 접근하고 값을 할당할 수 있어요. 이런 의미에서 함수는 변수에 "바인딩"되어 있다고 할 수 있죠.

예를 들어, adder 함수는 클로저를 반환해요. 반환된 각 클로저는 자신만의 sum 변수에 바인딩되어 있어요.

go
package main
 
import "fmt"
 
func adder() func(int) int {
	sum := 0
	return func(x int) int {
		sum += x // 외부 변수 sum을 캡쳐하여 사용
		return sum
	}
}
 
func main() {
	pos, neg := adder(), adder() // adder 함수를 호출하여 두 개의 클로저 생성
	for i := 0; i < 10; i++ {
		fmt.Println(
			pos(i),    // 첫 번째 클로저 호출, 양수 값을 더함
			neg(-2*i), // 두 번째 클로저 호출, 음수 값을 더함
		)
	}
}
 
go
package main
 
import "fmt"
 
func adder() func(int) int {
	sum := 0
	return func(x int) int {
		sum += x // 외부 변수 sum을 캡쳐하여 사용
		return sum
	}
}
 
func main() {
	pos, neg := adder(), adder() // adder 함수를 호출하여 두 개의 클로저 생성
	for i := 0; i < 10; i++ {
		fmt.Println(
			pos(i),    // 첫 번째 클로저 호출, 양수 값을 더함
			neg(-2*i), // 두 번째 클로저 호출, 음수 값을 더함
		)
	}
}
 

위 예제에서 adder 함수는 sum 변수를 캡쳐하는 클로저를 반환해요. 반환된 클로저는 sum 변수에 접근하고 값을 변경할 수 있어요.

main 함수에서 adder 함수를 두 번 호출하여 posneg 클로저를 생성해요. 각 클로저는 자신만의 sum 변수를 가지고 있어요.

for 루프에서 pos 클로저에는 양수 값을, neg 클로저에는 음수 값을 전달하며 호출해요. 각 클로저는 전달받은 값을 자신의 sum 변수에 누적해요.

실행 결과는 다음과 같아요:

text
0 0
1 -2
3 -6
6 -12
10 -20
15 -30
21 -42
28 -56
36 -72
45 -90
text
0 0
1 -2
3 -6
6 -12
10 -20
15 -30
21 -42
28 -56
36 -72
45 -90

pos 클로저는 0부터 45까지 양수 값을 누적하고, neg 클로저는 0부터 -90까지 음수 값을 누적하는 걸 볼 수 있어요.

이처럼 클로저는 외부 변수를 캡쳐하여 상태를 유지할 수 있어요. 이를 통해 함수형 프로그래밍의 강력한 기능을 구현할 수 있죠.

클로저는 Go 언어에서 함수를 일급 객체로 다룰 수 있게 해주는 중요한 개념이에요. 함수를 변수에 할당하거나 다른 함수의 인자로 전달할 수 있고, 함수 내에서 함수를 정의하고 반환할 수도 있죠. 이를 통해 코드의 모듈화와 추상화를 높일 수 있어요.

클로저를 사용할 때는 캡쳐된 변수의 라이프사이클과 메모리 관리에 주의해야 해요. 클로저가 외부 변수를 계속 참조하고 있다면 해당 변수는 가비지 컬렉션의 대상이 되지 않아요. 따라서 클로저를 적절히 관리하고 사용하는 것이 중요해요.

클로저는 함수형 프로그래밍, 콜백 함수, 지연 실행 등 다양한 시나리오에서 유용하게 사용될 수 있어요. Go 언어에서 클로저를 잘 활용하면 더 유연하고 표현력 있는 코드를 작성할 수 있답니다!

YouTube 영상

채널 보기
AI는 왜 수백 차원의 벡터를 사용할까? 고차원 공간과 행렬 | 선형대수학
Trie 자료구조 파이썬 구현: Search와 Starts With 연산 | Trie 자료구조 이야기
AI는 데이터를 어떻게 분류할까? 벡터의 거리와 KNN 알고리즘 | 선형대수학
AI에서 선형대수학이 중요한 이유
11편, 왜 DB마다 성능이 다를까? 엔진별 B-Tree 저장 방식 비교
3편, B-Tree 탐색 프로세스: 수백 개의 갈림길에서 데이터를 찾는 법
AI를 위한 선형대수 - 전단, 행렬식, 변환의 핵심
BTree 노드의 구조는?