Kotlin

    [Kotlin] 커링(Currying) 함수

    여러 개의 매개 변수를 받는 함수를 분리하여, 단일 매개 변수만 받는 부분 적용 함수의 체인으로 만드는 방법이다. 함수형 프로그래밍에서 커링을 사용하는 이유는 다양한 재사용과 마지막 매개변수가 입력될 때까지 함수의 실행 타이밍을 조절할 수 있다. 아래 코드는 코틀린의 확장함수를 사용하여 multiThree 함수와 같이 매개변수가 3개인 커링 함수를 일반화 하는 과정이다. curried() 확장 함수를 사용하여 매개변수가 3개인 함수를 커링 함수로 변환할 수 있다. 반대로 커링 함수를 일반 함수로 변환하는 unCurried() 함수도 구현했다. class Currying { fun ((P1, P2, P3) -> R).curried(): (P1) -> (P2) -> (P3) -> R = { p1: P1 ->..

    [Kotlin] Tailrec

    Tailrec? Tailrec은 언어 차원에서 제공하는 기능으로 해당 키워드가 명시된 함수가 꼬리 재귀의 조건에 부합하지 않으면 IDE에서 경고 메시지를 주고, 컴파일러 최적화가 발생하지 않는다. 꼬리 재귀란? 꼬리 재귀란 어떤 함수가 직간접적으로 자기 자신을 호출하면서도 그 호출이 마지막 연산인 경우를 뜻한다. 그리고 이 마지막 연산인 호출을 '꼬리 호출'이라 한다. 여기서 주의할 점은 마지막 호출에서 재귀 함수만 호출되어야 한다는 것이다. 일반적으로 재귀 호출이 반복되면서 깊이가 깊어지면 스택 오버플로우가 발생할 수 있는데, 꼬리 호출일 때는 스택 오버플로우가 발생하지 않는다. 왜냐하면 컴파일러가 해당 문제를 일으키는 스택 프레임을 재사용하기 때문이다. 이 경우 재귀를 사용했지만, 반복문을 사용한 것..

    [Kotlin] Sealed Class

    Sealed Class의 배경 컴파일러는 여러 개의 자식 Class들이 하나의 부모 Class를 상속받을 때 부모 Class와 자식 Class들의 연관성을 알지 못한다. 예를 들어 자동차의 행위에 대해 String을 리턴하는 코드를 작성한다고 생각해보자. 행위에 대한 3가지로 가는 상태(Drive), 멈추는 상태(Stop), 대기 상태(Stay)가 있다고 해보자. abstract class Vehicle object Go: Vehicle() object Stop: Vehicle() object Stay: Vehicle() 그리고 각 행위에 알맞은 String값을 리턴한다고 가정했을 때 아래와 같은 코드를 만들게 된다. fun getAction(action: Vehicle): String { return ..

    [코틀린] apply, with, let, also, run의 용도

    코틀린에는 범위 지정 함수인 apply, with, let, also, run 이 있다. 람다식이 제공된 객체에서 범위 지정 함수를 호출하면 임시 범위가 형성되고, 이 범위 내에선 이름 없이 객체에 접근할 수 있다. 하지만 하나의 코드 블럭에서 여러 범위 지정 함수가 중첩되면 가독성이 떨어지고 파악이 힘들어진다. 단, 중첩이 아닌 호출 체인으로 결합하면 코드의 가독성이 향상된다. apply 수신 객체의 함수를 사용하지 않고, 수신 객체 자신만 다시 반환하려는 경우. 대표적인 경우는 객체의 초기화이다. apply 사용 val user = User().apply{ name = "mj" gender = "male" } apply 미사용 val user = User() user.name = "mj" user.g..