람다 대수 관련 자료를 찾아보면 다음과 같은 규칙이 있다.
(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 함수들 같이)로 커링하여 외부에 노출 시킨다면
안정성이 훨씬 증가할 듯 보인다.
추신 : 이 글은 절대적인 글이 아니니, 수정사항이나 틀린부분 있으면 언제든지 지적을 부탁드립니다.
'프로그래밍 > Scala' 카테고리의 다른 글
[Slick] DateTime 로딩 시 오류. (0) | 2020.04.05 |
---|---|
Scala 로 뭔가 만들기 위해 필요한 것. (0) | 2020.03.18 |
akka 초반 간략정리. (0) | 2020.02.09 |
Typing Rules for Functions (0) | 2020.02.02 |
Covariant, Contravariant 그림으로 다시 정리 (0) | 2020.02.02 |
Covariant, Contravariant 정리 (0) | 2020.02.02 |
scala implicit keyword 관련 - 파라미터 (0) | 2019.11.17 |
[스칼라] Slick 오류 처리 (0) | 2017.03.26 |