클로저, 커링과 부분적용 - mustaine80/Scala GitHub Wiki

  1. 클로저(Closure)란 그 내부에서 참조되는 모든 인수에 대한 묵시적 바인딩을 지닌 함수를 칭한다. 다시 말하면 이 함수(또는 메소드)는 자신이 참조하는 것들의 문맥(context)을 포함한다.

    클로저는 함수형 언어나 프레임워크에서 코드 블록을 다양한 상황에서 실행하게 해주는 메커니즘으로 많이 쓰인다. 클로저를 map()과 같은 고차함수에 자료 변형 코드 블록으로 전달하는 것이 대표적인 예이다.

    또한, 클로저는 지연 실행의 좋은 예이다. 클로저 블록에 코드를 바인딩함으로써 그 블록의 실행을 나중으로 연기할 수 있다. 이 기능은 여로모로 쓸모가 있다. 예를 들어 클로저 블록을 정의할 때는 필요한 값이나 함수가 스코프에 없지만, 나중에 실행 시에는 있을 수 있다. 실행 문맥을 클로저 내에 포장하면 적절할 때까지 기다렸다가 실행할 수 있게 해준다.

  2. 커링(curring)은 다인수(multi-argument) 함수를 일인수(single-argument) 함수들의 체인으로 바꿔주는 방법이다. 이것은 그 변형 과정이지 변형된 함수를 실행하는 것을 지칭하는 것은 아니다. 함수의 호출자가 몇 개의 인수를 고정할지를 결정하며 적은 수의 인수를 가지는 함수를 유도해 낸다.

    부분적용(partail application)은 주어진 다인수 함수를 생략될 인수의 값을 미리 정해서 더 적은 수의 인수를 받는 하나의 함수로 변형하는 방법이다. 이 방법은 이름이 의미하듯이 몇몇 인수에 값을 미리 적용하고 나머지 인수만 받는 함수를 리턴한다.

    커링이나 부분적용 모두 몇몇 인수의 값만 주면 인수가 몇 개 빠져도 호출할 수 있는 함수를 리턴해준다. 다만 커링은 체인의 다음 함수를 리턴하는 반면에, 부분적용은 주어진 값을 인수에 바인딩시켜서 인수가 더 적은 하나의 함수를 만들어 준다. 이 두가지는 종종 같은 결과를 낳지만 이 중요한 차이점이 오해되곤 한다.

    예를 들어 foo(x:Int)(y:Int)(z:Int) 에서 x 를 커링하면 Int => (Int => Int) 가 반환되고, foo(x: Int, y: Int, z: Int) 에서 x 를 부분적용하면 (Int, Int) => Int 가 반환된다.

reference : Functional Thinking(함수형 사고), 닐포드