Notice
Recent Posts
Recent Comments
Link
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Archives
Today
Total
관리 메뉴

밤빵's 개발일지

[TIL]20241110 커링(Currying) 본문

Kotlin

[TIL]20241110 커링(Currying)

최밤빵 2024. 11. 10. 20:25

커링(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