더북(TheBook)

3.3.8 함수 부분 적용과 자동 커링

앞의 코드에서 클로저 버전과 커리한 함수 버전은 같은 결과를 내놓기 때문에 동등한 것으로 보인다. 하지만 실제로 이 둘은 의미상 다르다. 앞에서 이야기했지만 addTax 함수의 두 파라미터는 완전히 다른 역할을 한다. 세율인 taxRate는 자주 바뀌지 않지만, 가격인 price는 매번 함수를 호출할 때마다 달라진다. 클로저를 사용하는 함수 버전은 (val로 정의됐으므로) 바뀌지 않는 파라미터에 대해 닫혀 있다. 커리한 버전이 클로저를 사용하는 버전보다 세율을 더 자주 바꾸지 않겠지만, 커리한 버전에서는 함수를 호출할 때마다 두 인자를 모두 바꿀 수 있다.

세율을 바꿔야 하는 경우도 흔히 있다. 예를 들어 제품 종류에 따라 세율이 다르거나 배송 지역에 따라 세율이 달라질 수 있다. 전통적인 객체 지향 프로그래밍에서는 클래스가 세율을 받도록 파라미터화한 세금 계산기를 만들어서 이를 처리할 수 있다. 다음 코드를 보자.

class TaxComputer(private val rate: Double) {
    fun compute(price: Double): Double = price * rate + price
}

이 클래스를 사용하면 세율에 따라 여러 TaxComputer 인스턴스를 만들고 각 인스턴스를 필요에 따라 재사용할 수 있다.

val tc9 = TaxComputer(0.09)
val price = tc9.compute(12.0)

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