[Kotlin] 함수형 프로그래밍
Android/Kotlin

[Kotlin] 함수형 프로그래밍


📌 함수형 프로그래밍

위키 백과에는, 자료 처리를 수학적 함수의 계산으로 취급하고 상태와 가변 데이터를 멀리하는 프로그래밍 패러다임이라 적혀있습니다. 

수학적 계산이라 함은, 식으로 표현할 수 있다는 것이고, 이는 같은 값을 넣었을 때는 항상 같은 결과가 나온다는 것 인데요.

 

이것을 프로그래밍적으로 해결하기 위해 순수 함수와 일급 객체를 사용합니다.

 

그렇다면 순수 함수와 일급 객체는 무엇일까요?

 

📒 순수 함수

순수 함수란 같은 인자에 대하여 항상 같은 결과를 반환하며, 외부의 인자를 변경하지 않는 함수입니다.

 

순수 함수와 비순수 함수의 예시를 보며 비교해봅시다.

 

순수 함수의 예

fun sum(a: Int, b: Int) = a + b

비순수 함수의 예

var c = 100
fun sum(a: Int, b: Int) = a + b + c

c라는 다른 외부 요인에 의해 다른 결과를 반환 할 수 있는 가능성을 가지고 있기에 비순수 함수입니다.

 

비순수 함수의 예 2

var c = 100
fun sum(a: Int, b: Int) : Int {
    c = b // 부수 효과 발생
    return a + b
}

외부의 인자를 변경하고 있기에 다른 객체에 영향을 미칠 수 있습니다. 따라서 비순수 함수입니다.

 

함수형 프로그래밍의 특징인 항상 예측 가능한 결과를 만들어 내기 위해서는, 이와 같은 순수 함수의 특징이 반드시 필요합니다.

또한 결과의 변경 가능성이 배제되므로, 동시성 프로그래밍을 작성하기 편하다는 장점도 있습니다.

📘 일급 객체

일급 객체를 알기 전에 일급 시민(1st class ciizen) 개념에 대해서 알고 가야 합니다.

일급 시민이란, Christopher Strachey의 수업에서 나온 정의로, 인자로서 전달 할 수 있고, 반환값으로 전달 할 수 있고, 변수에 담을 수 있는 조건이 갖춰진 것을 의미합니다.

 

일급 객체(1st class object)란 특정한 언어에서 객체를 일급 시민으로 취급한다는 것이고, 마찬가지로 일급 함수(1st class function)란 함수를 일급 시민으로 취급하는 것을 말합니다.

 

kotlin의 함수는 일급 함수이기 때문에, 람다식을 사용하여 프로그래밍 할 수 있습니다.

 

많이 들어보셨을 람다식에 대해서는 짧게 정리하고 가겠습니다.

📗 람다식

람다식이란 익명 함수를 의미합니다.

람다식 문법 = (매개변수 목록) → { 실행문 }

이를 kotlin 함수에 적용시켜보면 아래와 같은 예시로 나타낼 수 있습니다.

fun setMinimum(result: (in: String, out: String) → Unit) {
   ...
}

setMinimum { // in, out ->
    ...
}

Unit 부분이 { 실행문 } 의 역할을 하는 것을 알 수 있습니다.

📚 정리

사실 자주 사용하는 map 이나 filter 함수 역시 고차함수입니다.

map, filter. 듣기만 하더라도 어떤 역할을 하는 함수인지 빠르게 유추하실 수 있으실 것 입니다.

왜 그럴까요? 변수명을 잘 지어서, 라고 할 수도 있겠지만. 해당 함수를 사용하였을 때, 늘 프로그래머가 예측가능한 결과를 내기 때문입니다.

이것이 함수형 프로그래밍이 지향하는 목적입니다.

 

재사용성이 높고 유지보수가 쉬운 함수를 다양하게 만듦으로써, 보다 편하고 안정성 높은 프로그래밍을 지향하자는 것 이 함수형 프로그래밍 목적이자 장점입니다.

 

하지만 단점 또한 명확합니다.

 

함수형 프로그래밍을 완성도 높게 구현하려면, 높은 단계의 추상화를 구상하여야하며, 따라서 설계 또한 쉽지 않습니다.  

상태가 없고, 순수하고, 재사용성이 높은 함수를 만들어야하니까요.

그렇기에 기존의 다른 패러다임의 프로그래밍에 익숙해진 대부분의 개발자들은 이를 학습하기 어렵습니다.

 

 

#함수형 프로그래밍 #일급 객체 #순수 함수 #람다식 #장점