-
함수형 프로그래밍 with KotlinAndroid & Kotlin 2022. 1. 20. 14:57
1. 함수형 프로그래밍이란?
"순수함수" 를 조합하여 문제를 해결하고 Immutable 하게 data를 처리하는 프로그래밍 페러다임의 한 종류이다.
2. 함수형 프로그래밍을 써야하는 이유
- 멀티스레드 환경에서 안전하다
- 함수 내부에서 값을 외부에 데이터를 바꾸지 않기 때문이다.
- 테스트와 디버깅이 쉽다
- 함수 한개 한개가 독립적으로 존재하고 의존성을 갖지 않는다.
- 순수함수라는 가정하에 잘못된 Output에 대해 Input만을 확인하면된다. 그 외의 것들을 확인할 필요가 없다.
3. 함수형 프로그래밍의 특징
1 ] 순수함수
함수형 프로그래밍은 순수함수의 조합이라고 볼 수 있습니다.
- 동일한 입력에 대해 항상 같은 값을 반환해야한다.
- 함수의 출력은 반드시 함수가 받은 인자(Input)에만 영향을 받는다.
- 함수의 외부의 어떤 상태도 바꾸지 않는다.
fun sum( a:Int , b : Int) = a + b
fun upgrade(){ val score = User.grade() if(score != null) { count ++ process(score) } }
두가지 예를 볼 보았을때 위에는 순수함수의 조건을 만족 아래는 순수함수의 조건을 어겼다고 볼 수 있다.
- [조건 2] User.grade() 즉 인자로 받지 않은 값에 영향을 받고 있고
- [조건 1] 따라서 동일 한 값을 반환 할지 보장 할 수 없으며
- [조건 3] 마지막 count 외부 변수의 상태 바꾸고 있습니다
함수내에서 필요한 값은 인자로 받아서 활용해야하며 외부의 값을 바꾸는 것이 아닌 필요하다면 복사를 통해서 처리하는 것이 맞습니다.
1번 조건을 잘 생각해보면 2번 조건 또한 포함한다고 볼 수 있습니다. 동일한 입력해 대해 동일한 결과를 반출하기 위해서는 반드시 입력해만 의존된 결과여야 합니다.
2 ] 람다식
3 ] 일급 객체
일급 개체는 아래 조건들을 만족해야합니다.
함수가 일급 객체일 경우 일급함수라고 할 수 있습니다.
- 함수의 인자로 전달할 수 있어야한다.
- 함수의 반환값으로 사용할 수 있어야한다.
- 변수에 담을 수 있어야한다.
자바에서의 함수는 일급 개체가 아니지만 코틀린의 함수는 일급 개체이다.
fun test1(sum : (Int , Int ) -> Int , a: Int , b: Int) : Int{ return sum(a , b) }
[조건 1] 위 예제에서는 함수의 인자로 함수가 전달 됨 을 볼 수 있다.
fun main() { val t = test2() val result = t(100,200) print(result) // 300 } fun test2() : (Int , Int) -> Int { return { x , y -> x + y} }
[ 조건 2 ]위 예제의 test2 함수의 리턴 자료형을 보면 람식으로서 함수를 반환하고 있다.
[ 조건 3 ]그리고 main에서 test2 함수의 리턴인 람다 함수를 t라는 변수에 담아냈다.
이렇게 람다함수 { x , y -> x + y }를 갖게된 t변수에 인자를 넣어 결과값을 얻을 수 있다.
4 ] 고차함수
특정 함수를 받아서 함수를 반환하는 형태로서 함수들을 조합하여 또 다른 함수를 만들고 이를 통해 시스템을 운영하는 함수형 프로그래밍에서 유용하게 사용할 수 있다. 이번 과제중
val applyConditions: (value: Int, conditions: List<Pair<(Int) -> Boolean, Type>>) -> List<Type> = { value, conditions ->
val result = mutableListOf<Type>()
conditions.forEach { if (it.first(value)) result.add(it.second) }
result
}
라는 함수를 만들어 보았다. 각각의 특성을 확인해주는 함수들을 받아 어떤 수가 그 특성들을 갖는지 확인할 수있는 함수이다.
순수함수가 함수형 프로그래밍이 기본이라면 고차함수는 함수형프로그래밍에 꽃같은 느낌이었다.프로그래밍 패러다임에 따라 장단점이 있고 서비스에 특징에 맞게 프로그래밍 패러다임을 선택해서 사용할 수 있다면 매우 유용하겠다.
또 큰 서비스 안에서도 내부적으로 그 특징에 맞게 또 다른 패러다임을 이용하는 것도 좋겠다.'Android & Kotlin' 카테고리의 다른 글
[ Android ] startActivityForResult deprecated 이유와 대안( Activity Result API) (0) 2022.02.15 [ 코틀린 ] 코루틴2 : Coroutine 사용하기 - 기초 (0) 2022.02.02 [ 코틀린 ] 코루틴1 : Coroutine 이해하기 (0) 2022.02.02 Thread 에서 UI 접근 (0) 2021.06.14 [안드로이드] volly 로 안드로이드와 서버의 연결(get ,post) (0) 2021.05.18 - 멀티스레드 환경에서 안전하다