스칼라 함수형 프로그래밍 - Partially applied functions (부분 적용 함수)의 이해와 활용
View: 192
0
0
작성자: 달빛제이크
카테고리: Scala Language
발행: 2024-06-10
수정
2024-06-21
안녕하세요. 달빛제이크입니다.
오늘은 스칼라 함수형 프로그래밍에서 아주 재미있는 역할을 하고 있는 부분 적용 함수, Partially applied functions에 대해서 알아보겠습니다.
지난 글에서 우리는 Function literal과 Function value에 대해서 이야기 했습니다.
Function literal은 Function value를 만들기 위해 작성하는 Lambda expression 형식의 구문이고, Runtime 때 Function value가 되어 함수에 인자로 넘길 수 있다고 했습니다.
Partially applied function
그렇다면 우리가 def를 써서 일반적으로 정의한 함수를 어떻게 다른 함수에 인자로 넘길 수 있을까요?
이것을 가능하게 하기 위해 Partially applied function(부분 적용 함수)이 사용됩니다.
Partially applied function은 일반적으로 정의된 함수의 Parameter 일부 또는 전부를 placeholder(_, underscore)로 대체하여 Function value를 만들기 위한 함수입니다.
def sum(a: Int, b: Int, c: Int) = a + b + c
// 일반적인 함수 호출
val res1 = sum(1, 2, 3) // 6
// 부분 적용 함수
val a = sum(_, _, _) // (Int, Int, Int) => Int 형식의 Function value로 변환
val res2 = a(1, 2, 3) // 6
val b = sum // 모든 Parameter를 placeholder로 대체할 때 간단히 함수 이름으로 간단히 표현
val res3 = b(1, 2, 3) // 6
val c = sum(1, _, 3) // Int => Int 형식의 Function value로 변환
val res4 = c(2) // 6
예제에서 sum(_, _, _) 또는 sum(1, _, 3)을 우리는 Partially applie function이라고 부르고 Runtime에서 Instance 화 되어 Function value로 변환 됩니다.
변환된 Function value는 해당 변수에 저장이 되고 다른 함수에 argument로 사용할 수 있습니다.
def sum(a: Int, b: Int, c: Int) = a + b + c
val a = sum(1, _, 3)
def addAnyNumber(a: Int, b: Int => Int) = b(a)
val b = addAnyNumber(2, a)
println(b) // 6
Partially applied function Usage
Partially applied function이 필요한 경우를 정리하면,
- 함수에 선언된 Parameter 일부를 필요에 의해 고정 값으로 정해놓고 특정 Parameter의 값만 달리 주고 싶을 때
- 작성한 함수를 동일한 형식으로 재 작성할 필요 없이 유연하게 변형해서 사용할 수 있습니다.
- 일반 함수를 Function value로 만들어 다른 함수의 인자로 전달하고 싶을 때
- 함수형 프로그래밍을 작성하기 위해 반드시 필요한 기능입니다. 호출 받은 함수가 Task를 수행하는 방식을 개발자가 원하는 데로 정의할 수 있는 막강한 기능입니다.
Patially applied functions는 Function literals와 함께 First-class function을 만들기 위해 중요한 개념입니다.
그렇지만, 문법 자체가 간단해서 실제로 코딩을 하면서 쉽게 익숙해질 수 있을 것입니다. 실제로 스칼라로 코딩을 하다 보면 많이 사용하게 됩니다.
다음 글에서는 Functions and Closures의 주제 중 마지막 내용인 Closures에 대해서 알아보겠습니다.
감사합니다.
