클로저는 리스펙스에서 가장 강력한 기능 중 하나입니다. 함수가 생성된 환경을 "기억"하게 해주는 메커니즘입니다. 이 가이드는 클로저가 무엇이며 왜 유용한지 단계별로 안내합니다.
클로저란 무엇인가?
간단히 말해, 클로저는 자신의 "배낭"과 함께 묶인 함수입니다. 이 배낭에는 함수가 생성된 순간에 스코프에 있던 모든 변수가 들어 있습니다.
이는 함수가 프로그램의 전혀 다른 부분에서 호출되더라도, 그 "기억된" 변수들에 접근할 수 있음을 의미합니다.
가장 일반적인 패턴인 "함수 팩토리"를 통해 이를 탐구해 봅시다.
함수 팩토리 패턴
비슷한 일을 하는 많은 함수가 필요하다고 상상해 보세요. 예를 들어, 숫자에 5를 더하는 함수, 10을 더하는 함수, 100을 더하는 함수가 필요합니다. 각각을 손으로 작성하는 대신, 이러한 함수들을 제조하는 "팩토리"를 만들 수 있습니다.
1단계: 팩토리 함수 작성하기
우리의 팩토리인 make-adder는 하나의 인자 amount-to-add를 받고, 그 역할은 새로운 함수를 반환하는 것입니다.
(define (make-adder amount-to-add)
(lambda (n)
(+ n amount-to-add)))
2단계: 클로저의 "마법"
(make-adder 5)를 호출하면 다음과 같은 일이 일어납니다:
make-adder호출을 위한 새로운 임시 환경이 생성됩니다.- 이 환경 내에서, 파라미터
amount-to-add는 값5에 바인딩됩니다. lambda함수가 생성됩니다. 생성되면서, 주변을 둘러보고 볼 수 있는 모든 변수를 "배낭"에 담습니다.amount-to-add가5인 것을 보고, 그 정보를 챙겨둡니다.make-adder는 종료되고,amount-to-add = 5가 담긴 배낭과 함께lambda함수를 반환합니다.
이렇게 반환된 함수(람다 + 배낭)가 바로 클로저입니다.
3단계: 생성된 함수 사용하기
이제 우리의 팩토리를 사용하여 특화된 함수들을 만들 수 있습니다:
;; 항상 5를 더하는 함수를 만듭니다.
(define add-five (make-adder 5))
;; 항상 10을 더하는 함수를 만듭니다.
(define add-ten (make-adder 10))
;; 사용해 봅시다!
(add-five 100)
;; 결과: 105
;; add-five 함수는 자신의 "배낭"에 손을 뻗어
;; `amount-to-add`가 5였음을 기억합니다.
(add-ten 100)
;; 결과: 110
;; add-ten 함수는 자신만의, 분리된 배낭을 가지고 있으며
;; 거기에는 `amount-to-add`가 10이었습니다.
왜 이것이 유용한가?
이 패턴은 매우 강력합니다. 즉석에서 맞춤형, 사전 구성된 함수를 만들 수 있게 해줍니다. 다음과 같은 용도로 사용할 수 있습니다:
- 설정 가능한 이벤트 핸들러 만들기.
- 초기 상태를 가진 함수 설정하기.
- 커링(currying) 및 부분 적용(partial application)과 같은 고급 패턴.
결론
클로저를 이해하는 것은 리스펙스에서 함수형 프로그래밍을 마스터하는 데 핵심입니다. 기억하세요: 클로저는 함수 + 그 함수의 생성 환경(배낭)입니다. 이 개념을 통해 더 우아하고, 모듈화되고, 재사용 가능한 코드를 작성할 수 있습니다.
더 공식적인 정의를 원하시면, 언제든지 함수와 클로저 개념 페이지를 다시 방문할 수 있습니다.