Scala에서 값에 의한 호출과 이름에 의한 호출

Suraj P 2023년6월21일
  1. Scala에서 값으로 호출
  2. Scala에서 이름으로 호출
  3. Scala의 Call by Value 대 Call by Name 전략
  4. 결론
Scala에서 값에 의한 호출과 이름에 의한 호출

이 기사에서는 Call-by-Value 및 Call-by-Name 기능과 Scala의 평가 전략에 대해 알아봅니다. 그리고 그것들을 실제로 사용하는 방법에 대해 논의할 것입니다.

Scala에서 값으로 호출

Scala의 함수 인수는 기본적으로 값별 호출로 간주됩니다. 작은 예를 살펴보겠습니다.

def example(x:Int) = x*x

위의 코드에서 인수를 값에 의한 호출로 사용하는 example 함수를 정의했습니다.

일반적으로 Scala의 연산자와 마찬가지로 매개변수화된 함수는 컴파일러에서 동일한 방식으로 평가됩니다. 먼저 모든 함수 인수는 왼쪽에서 오른쪽으로 평가됩니다. 그런 다음 모든 함수 응용 프로그램이 함수의 오른쪽으로 대체됩니다.

동시에 모든 함수의 공식 매개변수가 실제 매개변수로 대체됩니다.

값별 호출 전략의 큰 장점 중 하나는 모든 함수 인수가 한 번만 평가된다는 것입니다.

Scala에서 이름으로 호출

인수를 이름으로 호출하도록 함수 인수 앞에 =>(심볼보다 크거나 같음)만 붙입니다.

더 잘 이해하기 위해 작은 예를 살펴보겠습니다.

def example(x: =>Int) = x*x

위 코드에서 매개변수 x는 값으로 호출됩니다. call-by-name 평가는 call-by-value 전략과 동일하지만 한 가지 중요한 이점이 있습니다. 해당 값이 함수 본문 내에서 사용될 때까지 함수가 평가되지 않는다는 것입니다.

Scala의 Call by Value 대 Call by Name 전략

int 유형이고 값으로 호출되는 x와 int 유형이고 이름으로 호출되는 y라는 두 개의 매개변수가 있는 add 함수가 있다고 가정해 보겠습니다.

def add(x: Int, y:=>Int) = x+x

call-by-value 전략을 사용하여 add 함수가 어떻게 평가되는지 살펴보겠습니다.

assert(add(3+3,8) == 12)

여기에서 값별 호출은 먼저 3+3 표현식을 평가한 다음 6 값을 함수 본문에 전달합니다. 매개변수 x가 자체에 추가되어 12로 최종 답을 계산합니다.

이제 call-by-name 전략을 사용하여 평가된 동일한 함수를 살펴보겠습니다.

assert(add(8,3+3) == 16)

이 경우 매개 변수 y가 함수 본문 내에서 사용되지 않기 때문에 이름별 호출 전략에서 3+3이 무시됩니다. 따라서 x가 자체에 추가되어 최종 답이 16으로 계산됩니다.

이 경우 call-by-name 전략이 call-by-value 전략보다 조금 더 빠르다고 말할 수 있습니다.

자신을 무한히 재귀적으로 호출하는 함수가 있는 예를 하나 더 살펴보겠습니다.

def myFun(): Int = myFun() + 1

이제 이 함수를 add 함수에서 매개변수 x로 사용하면 값에 의한 호출 인수 xStackOverflowError를 제공합니다.

assertThrows[StackOverflowError]
{
add(myFun(),5)
}

위의 코드에서 함수를 호출하면 myFun() 메서드가 함수 본문보다 먼저 평가되기 때문에 StackOverflowError가 발생합니다. 반대로 myFun 메서드를 이름별 호출 인수로 사용하면 함수 본문 내에서 평가되지 않기 때문에 예외 없이 함수 호출이 성공적으로 실행됩니다.

assert(add(5, myFun()) == 10)

코드에서 사용하기에 더 나은 것

위의 예를 기반으로 이름별 호출 전략은 전달된 인수가 함수 본문 내에서 평가되지 않을 가능성이 있으므로 더 효율적이므로 더 매력적으로 보입니다.

그러나 전체적으로 보면 call-by-value 전략이 call-by-name 전략보다 더 효율적이다. 또한 코드에서 인수가 평가되는 시점을 알고 있기 때문에 부작용을 피할 수 있습니다.

결론

이 기사에서는 Scala의 call-by-name 및 call-by-value 전략에 대해 배웠습니다. 우리는 그것들이 어떻게 평가되고 사용되는지를 배웠고, 대부분의 경우 가치별 전략이 사용하는 것이 더 낫다는 결론을 내렸습니다.

작가: Suraj P
Suraj P avatar Suraj P avatar

A technophile and a Big Data developer by passion. Loves developing advance C++ and Java applications in free time works as SME at Chegg where I help students with there doubts and assignments in the field of Computer Science.

LinkedIn GitHub

관련 문장 - Scala Function