이름에 의한 호출, 값에 의한 호출 (callByName, callByValue) with Kotlin

Lazysoul
4 min readFeb 5, 2017

--

이번에 정리할 내용은 call by name, call by value입니다. 함수형 프로그래밍을 공부하면 자주 나오는 개념들 입니다. 개념이 어렵지 않아 쉽게 이해할 거라 생각합니다.

Call by value란?

Call by value 란, 영어그대로 값을 참조합니다. 즉 함수가 인자로 전달 될 경우, 그 즉시 함수를 평가하는 걸 말합니다. 여기서 평가라는 표현은 실제 함수의 수행이라고 이해하면 될것 같습니다.

funA()는 callByValue 함수의 파라미터로 전달 됩니다. 전달 된 값을 사용하는 시점은 callByValue 메소드 내부에서 println(“callByValue”)가 호출된 이후 입니다. 즉 전달받은 값을 사용하기 전에(전달받은 순간) 이미 값이 평가되었습니다.

callByValue 개념은 함수가 인자로 전달 될 때, 값이 평가되며 평가된 값이 메소드의 argument로 전달됩니다. 그렇기 때문에 “funA” 가 먼저 출력 되고 “callByName”이 이후에 출력됩니다.

CallByName이란?

callByName이란? 값이 파라미터로 전달 될때 평가되지 않고, 실제로 call이 될때 평가하는 것을 말합니다. 간단한 예제를 보겠습니다.

얼핏 보면 callByValue와 굉장히 유사합니다. 함수 callByName은 f : () -> Boolean 이라는 함수타입을 인자로 전달 받습니다. 코드는 크게 2가지 차이점이 있습니다.

  • callByValue에서는 Boolean값인 b를, callByName에서는 값이 아닌 함수를 인자로 전달받았습니다.
  • callByValue는 funA()callByName은 funA 를 파라미터로 전달했습니다.

callByName은 funA를 파라미터로 전달한시점이 아닌 f()가 call되는 시점에 값이 평가됩니다.

그래서??

개념은 알겠는데 이걸 어디다 써먹어야 할까??? 그래서 어쩌라고??? 라는 생각을 할 수 있습니다. 리소스가 많이들고 시간도 많이드는 복잡한 연산을 하는 메소드 A가 있다고 가정합니다. 하지만 메소드 A는 특정 조건에 따라 수행이 될수도 있고, 수행 되지 않을 수도 있습니다. 간단한 코드로 예를 들어 보겠습니다.

callByValue의 경우 condition이 true, false 상관이 모두 callByValue(condition, doSomething())이 호출 될 때 doSomething()을 평가 하게 됩니다. 실제로는 condition이 true일 경우에만 전달된 값을 사용하지만 doSomething은 파라미터로 넘겨지는 순간 평가됩니다. doSomething이 연산도 복잡하고, 메모리도 많이 들고, 시간도 오래걸린다면 매우 비효율적인 코드가 됩니다.

그렇다면 callByName은 어떨까요?

condition이 true일 경우에는 callByValue 와 비슷하게 동작합니다. 하지만 과정이 다릅니다. callByValue와 다르게 파라미터로 전달 될때는 평가되지 않고, 14번 째 라인 value() 에서 평가가됩니다. condition이 false 일 경우에는 value를 평가하지 않습니다.

극단적인 예제를 통해 설명했습니다. 이처럼 함수를 전달 할 때 , 함수의 규모와 호출 가능여부를 를 파악한 후 상황에 맞게 callByValue, callByName 을 사용하면 보다 효율적인 코드를 작성 할 수 있습니다.

Contents

--

--