336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

람다 대수 관련 자료를 찾아보면 다음과 같은 규칙이 있다. 


(x, y -> ax + by) 는 (x -> y -> ax + by) 형태로 바꿀 수 있으며 이를 커링 이라고 한다. 


Scala 를 공부하면서 가장 많이 접하는 형식인데, 지금까지 내가 쓰고있던 명령형 언어들(C/C++) 과는 형식이 많이 달라 혼란스러웠지만, 이제 머릿속으로 정리되는 듯 하여 글로 남긴다. 



대체 커링은 왜 쓰는 것인가?


Scala 공부하는 내내 '커링 이걸 대체 왜 쓰고, 어디다가 쓰는 것인가?' 란 생각이 가장 많이 들었고 오늘에서야 그 답을 찾았다. 행여나 이 글을 읽는 분께는 아래 설명이 '절대적인 정답' 이 아닌 '쓰임새 중 하나' 로 이해하시길 바란다. 


쓰임새 중 하나 : 디폴트 파라미터에 적용할 수 있다. 


우선 C++ 코드를 보자, 공간이 없어 full code 는 올리지 않겠다.

(나중에 시간이 나면 gut hub 같은데 올릴수도..)


int Adder(int num1=1, int num2=2)
{
  return num1+num2;
}


쉽게 알 수 있듯 파라미터로 넘어온 num1 과 num2 의 합을 리턴해주는 코드다.

위 C++코드엔 몇가지 제약사항이 있다. 


1. default 파라미터 뒤에, default 가 아닌 파라미터가 오면 안된다. 

  =>int Adder(int num=1, int num2 = 2, int num3) 은 안된다는 소리다(컴파일에러)

2. 매개변수가 주어지지 않을 때, default 파라미터는 왼쪽 변수부터 적용이 된다.

  => Adder(3) 으로 호출이 되었을 때 num1 의 값은 3이고, num2 의 값은 2이다.

  => num1 에는 default, num2에는 4 값을 사용토록 하려면 Adder(1,2) 같은 형태로 호출해야 한다.


Scala 에선 커링을 이용하면 이를 좀 다른 방법으로 사용할 수 있다.

(주, Scala 에서는 언어 차원으로 default parameter를 지원한다. 

링크 :  http://docs.scala-lang.org/ko/tutorials/tour/default-parameter-values )


위의 C++ 코드와 같은 기능을 하는 Scala 함수를 생각해보자 


def Adder(x : Int, y : Int) : Int = x + y


이 함수를 커링하면

def AdderDefaultX(x : Int)(y : Int) : Int = x + y

혹은

def AdderDefaultY(y : Int)(x : Int) : Int = x + y

이렇게 된다.


이후, x 값을 100 이 default  로 정해놓고 싶다면 


val AdderX100 = AdderDefaultX(100)


y 값을 100 으로 정해놓고 싶다면 


val AdderY100 = AdderDefaultY(100)


이렇게 하면 된다. 


위의 예시는 '그냥 이렇게 쓴다' 란 정도로 설명을 해 둔것이고. 


라이브러리 등의 구현(여러명이 같이 작업할 코드들)에서


'이 함수는 불려질 때 반드시 어떤 파라미터가 어떤 값이 되어야 함.' 이 호출 규칙일 때 


위 아래로 주석을 달거나, 문서화를 하기 보다는 


특정 파라미터를 특정 값으로 세팅한 함수(위의 Adder 함수들 같이)로 커링하여 외부에 노출 시킨다면 


안정성이 훨씬 증가할 듯 보인다. 


추신 : 이 글은 절대적인 글이 아니니, 수정사항이나 틀린부분 있으면 언제든지 지적을 부탁드립니다.


블로그 이미지

캡틴토마스

그저 걷고 있는거지...

,