JavaScript
를 비롯한 여러 Functional Programming paradigm을
지원하는 언어에서 쉽게 볼 수 있는
Closure가 scala 에서는 어떤 모습일까?
Functional Programming paradigm을 지원하는
여러 언어에서 쉽게 접할 수 있는 Closure
본인이 공부한 것을 공유한다
(x: Int) => x + more
이와 같은 함수값(function literal)이 있을 때,
x는 function literal의 scope에서만 의미가 있으므로
bound varaible(바운드 변수)라고 한다.
more은 function literal에서 정의(define)한 게 아니고
다른 scope에서 변경된 것이고 변경될 여지가 있기 때문에
free varaible(자유 변수)라고 한다.
이를테면,
var more = 1
val addMore = (x: Int) => x + more
addMore(1) // What is the result?
일 때 이 때
addMore
function literal을 closure
라고 한다.
즉, closure
는 변수가 참조하는 값이 아니라
그 변수 자체를 capture
한다.
그래서 아래와 같이 free variable
에 변화가 생겼을 때 capture
할 수 있다.
var more = 1
val addMore = (x: Int) => x + more
println(addMore(1)) // 1
more = 9999
println(addMore(1)) // 2
이 때 1
, 2
의 결과는 무엇일까?
more이 중간에 9999
로 상태의 변화가 일어났다.
앞의 설명에 따르면
capture
를 다시 할텐데 결과는 어떨까?
closure
인 addMore
이 more
의 상태 변화를 실행할 때 capture
한다.
그래서 1
의 결과는 2
가 되고
2
의 결과는 10000
이 된다.
scala에서 제공하는 repl
을 이용하여 확인해볼 수 있다.