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를 다시 할텐데 결과는 어떨까?

closureaddMoremore의 상태 변화를 실행할 때 capture 한다.

그래서 1의 결과는 2가 되고

2의 결과는 10000이 된다.

scala에서 제공하는 repl을 이용하여 확인해볼 수 있다.