Higher-Order Function in Kotlin

한글로 고차함수

고차함수는 다른 함수를 생성/소비(실행) 하여 그 결과를 반환하는 함수를 말합니다.

함수(f)의 인자로 새로운 함수(g)를 전달하는 함수(f)를 말하는 것입니다.

Java 에서는 다음과 같이 표현할 수 있습니다.

// define function
interface DoSomething {
Object doSomething();
}
// define higher-oder function
Object doSomething(DoSomething do) {
return do.doSomething();
}
// define usage
doSomething(new DoSomething() {
@Override
public Object doSomething() {
// do something
}
});

이를 람다 표현식으로 나타내면

doSomething(() -> {
// do something
});

위와 같이 됩니다.

제가 자주 쓰는 것은 주로 Android 에서 Sqlite Access 시에 Locking 을 하는 것입니다.

다음과 같죠

class LockTemplate {
private Lock lock = new ReentranceLock();
<T> T execute(Executable<T> executable) {
lock.lock();
try {
return executable.execute();
} finally {
lock.unlock();
}
}
interface Executable<T> {
T execute();
}
}
class Repository extends LockTemplate {
boolean save(User user) {
return execute(() -> {
dao.save(user);
return true
}
}

하지만 Java 에서는 이를 구현하기 위해서는 항상 1개 method 를 가진 Interface 를 정의하고 구현해야 합니다.

Kotlin 에서는 고차함수를 좀 더 쉽게 구현 할 수 있도록 하였습니다

// define higher-order function
<T> fun execute(e : () -> T) : T {
lock.lock()
try {
return e()
} finally{
lock.unlock()
}
}
// define usage
fun save(user: User) : Boolean {
execute {
dao.save(user)
true
}
}

위의 코드를 보면 e 라는 인자는 실제로는 함수로써 아래처럼 람다표현식으로 정의하였습니다.

e : () -> T

인자가 없는 함수로써 T 를 리턴할 것이다 라고 정의하였습니다.
그리고 이 함수를 인자로 정의함으로써 함수형 인자가 되는 것입니다.

execute(e) { e() }

그래서 별도의 interface 선언 없이도 고차함수를 쉽게 구현할 수 있음을 알 수 있습니다.

실제로 이러한 코드는 Kotlin 에 전반적으로 정의 되어 있습니다.
Kotlin 에서 사용하는 함수 중에 run, with, let, apply 가 있는데 그중에 apply 에 대해 보겠습니다.

public inline fun <T> T.apply(block: T.() -> Unit): T { block(); return this }

위의 함수를 보면

block: T.() -> Unit

은 T 내부 함수로 사용 될 것이며 Unit (Void) 형으로 반환 할 것임을 명시하였습니다.

T.apply(block) : T {
block()
return this
}

고차함수의 반환은 T 로 하며 내부 함수는 block() 을 실행 후 T 를 반환하도록 하였습니다.

이처럼 고차함수는 Kotlin 과 같은 함수형 프로그래밍을 지원하는 언어에서는 매우 중요한 개념입니다.

이 개념을 이해 했을 때 apply, let, run, with 의 동작을 이해할 수 있고 직접 고차함수를 구현할 수 있습니다.

Kotlin 을 사용하실 예정이라면 알아보시고 사용해보시길 권장합니다.

읽어보면 좋은 것 : Kotlin 의 유용한 함수 let, run, with, apply

One clap, two clap, three clap, forty?

By clapping more or less, you can signal to us which stories really stand out.