밤빵's 개발일지
[TIL]20241110 커링(Currying) 본문
커링(Currying)은 여러 개의 매개변수를 갖는 함수를 단일 매개변수를 갖는 함수의 연속으로 변환하는 기법이다. 이를 통해 함수를 부분 적용하여 코드의 유연성을 높이고 재사용성을 강화할 수 있다
▶ 커링(Currying)
커링은 함수형 프로그래밍의 중요한 개념 중 하나이다. 함수가 여러 개의 인자를 받을 때, 이를 부분 적용하여 하나의 인자만 받는 함수들을 연속적으로 반환할 수 있도록 변환하는 것을 의미한다. 예를 들어, 두 개의 매개변수를 갖는 함수 f(a, b)는 f(a)(b)의 형태로 변환될 수 있다. 이는 각 인자를 하나씩 받아 최종 결과를 반환하는 방식으로 동작한다.
코틀린에서는 기본적으로 커링을 지원하지 않지만, 고차 함수를 사용하여 커링을 구현할 수 있다.
▶커링 구현 방법
코틀린에서 커링을 구현하기 위해 고차 함수와 람다식을 사용한다.
▷두 개의 매개변수를 받는 함수를 커링 형태로 변환하는 예제
fun add(x: Int): (Int) -> Int = { y -> x + y }
fun main() {
val addFive = add(5)
println(addFive(3)) // 출력: 8
println(add(2)(4)) // 출력: 6
}
→ add 함수는 x를 받아 또 다른 함수를 반환하고, 반환된 함수는 y를 받아 x + y의 결과를 반환한다. 이를 통해 함수 add는 부분 적용이 가능해진다.
▶커링의 장점
함수 재사용성 증가
커링된 함수는 특정 인자를 고정시켜 부분 적용된 함수를 쉽게 생성할 수 있다. 이는 코드의 재사용성을 높여준다.
유연한 함수 조합
커링을 통해 함수의 반환값을 다른 함수의 인자로 전달하여 복잡한 로직을 보다 간결하게 작성할 수 있다.
Lazy Evaluation
커링된 함수는 일부 인자만 받고도 부분적으로 실행이 지연될 수 있어 필요할 때만 실행되도록 조절할 수 있다.
▶함수 조합 활용
커링은 함수 조합에도 유용하게 사용된다. 여러 개의 함수를 조합하여 새로운 기능을 만드는 경우, 커링된 함수를 사용하면 코드가 더욱 간결해지고 가독성이 높아진다.
fun multiply(x: Int): (Int) -> Int = { y -> x * y }
fun addAndMultiply(a: Int, b: Int): (Int) -> Int = add(a) andThen multiply(b)
infix fun <P, R, Q> ((P) -> R).andThen(next: (R) -> Q): (P) -> Q = { p -> next(this(p)) }
fun main() {
val combinedFunction = addAndMultiply(2, 3)
println(combinedFunction(4)) // 출력: (2 + 4) * 3 = 18
}
→ andThen은 두 개의 함수를 조합하여 하나의 연속된 함수로 만드는 고차 함수이다. addAndMultiply는 먼저 add 함수를 적용한 후 multiply를 적용하여 최종 결과를 반환한다.
▶Lazy Evaluation & 커링
Lazy Evaluation는 코드가 실행될 때 필요한 부분만 평가하는 기법이다. 커링된 함수는 부분적으로 인자를 적용한 후 필요할 때 나머지 인자를 받아 실행될 수 있어 지연 평가를 구현하는 데 유용하다.
fun generateMessage(prefix: String): (String) -> String = { name -> "$prefix, $name!" }
fun main() {
val helloMessage = generateMessage("Hello")
println(helloMessage("Kotlin")) // 출력: Hello, Kotlin!
val customMessage = generateMessage("Welcome")
println(customMessage("Developer")) // 출력: Welcome, Developer!
}
→ generateMessage 함수는 prefix 인자를 받아, name 인자를 나중에 적용하는 함수로 반환된다. 이를 통해 부분적으로 함수를 생성하고 필요할 때 실행할 수 있다.
커링은 코틀린에서 함수의 유연성과 재사용성을 높이는 데 유용한 기법이다. 코틀린이 기본적으로 커링을 지원하지는 않지만, 고차 함수와 람다식을 통해 쉽게 구현할 수 있다. 커링을 활용하면 복잡한 함수 조합을 간결하게 표현하고, 지연 평가를 적용하여 코드의 효율성을 높일 수 있다. 코틀린의 함수형 프로그래밍 개념을 더 깊이 이해하고 싶다면 커링을 적극 활용해보는 것이 좋다.
'Kotlin' 카테고리의 다른 글
[TIL]20241127 자동차 경주 게임 구현 (5) | 2024.11.27 |
---|---|
[TIL]20241118 확장성과 오버엔지니어링 (3) | 2024.11.18 |
[TIL]20241109 sealed interface (0) | 2024.11.09 |
[TIL]20241108 Lazy (1) | 2024.11.08 |
[TIL]20241107 실드클래스(Sealed Class) (1) | 2024.11.07 |