더북(TheBook)

3.3.7 클로저 구현하기

순수 함수가 결과를 계산할 때 자신의 인자를 제외한 그 어떤 것에도 영향을 받지 않아야 한다는 사실을 알았다. 코틀린 함수는 종종 함수 밖에 있는 요소에 접근한다. 그 요소는 패키지 수준의 프로퍼티이거나 클래스나 객체의 프로퍼티일 수 있다. 심지어 함수가 다른 클래스의 동반 객체나 다른 패키지의 멤버에 접근할 수도 있다.11

앞에서 순수 함수가 참조 투명성을 지키는 함수라고 말했다. 이는 함수를 반환하는 것 외에 외부에서 관찰 가능한 효과가 없어야 한다는 뜻이다. 하지만 반환 값이 자신의 인자뿐 아니라 자신을 둘러싸고 있는 영역에 있는 요소에 의해서도 결정된다면 어떨까? 이미 이런 경우를 살펴봤다. 그리고 이런 경우 자신을 둘러싸고 있는 영역의 요소를 함수가 사용하는 암시적 파라미터로 간주할 수 있다.

이와 같은 사고방식을 람다에 적용할 수 있다. 코틀린 람다에는 자바 람다와 같은 제약이 없다. 오직 동작상 파이널(effectively final)인 참조에만 접근할 수 있는 자바 람다와 달리 코틀린 람다는 자신을 둘러싸고 있는 영역에 있는 가변 변수에 자유롭게 접근할 수 있다. 예를 한 가지 살펴보자.

val taxRate = 0.09
fun addTax(price: Double) = price + price * taxRate

이 코드에서 addTax 함수는 taxRate라는 변수에 대해 닫혀 있다. 여기서 addTaxprice의 함수가 아니라는 점이 중요하다. 이유는 인자가 같아도 결과가 달라질 수 있기 때문이다. 하지만 이를 (price, taxRate)라는 튜플에 대한 함수로 볼 수 있다.

 

 


11 역주 앞의 커리한 함수에서도 봤지만, 함수가 다른 함수 안에 있다면 바깥쪽 함수 안에 정의된 변수나 다른 함수의 인자에 접근할 수 있다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.