ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 함수형 프로그래밍 with Kotlin
    Android & Kotlin 2022. 1. 20. 14:57

    1. 함수형 프로그래밍이란?

     

    "순수함수" 를 조합하여 문제를 해결하고 Immutable 하게 data를 처리하는 프로그래밍 페러다임의 한 종류이다.

     

    2. 함수형 프로그래밍을 써야하는 이유

    •  멀티스레드 환경에서 안전하다 
      • 함수 내부에서 값을 외부에 데이터를 바꾸지 않기 때문이다.
    •  테스트와 디버깅이 쉽다
      • 함수 한개 한개가 독립적으로 존재하고 의존성을 갖지 않는다.
      • 순수함수라는 가정하에 잘못된 Output에 대해 Input만을 확인하면된다. 그 외의 것들을 확인할 필요가 없다.

     

    3. 함수형 프로그래밍의 특징

    1 ]  순수함수 

    함수형 프로그래밍은 순수함수의 조합이라고 볼 수 있습니다.

     

    1.  동일한 입력에 대해 항상 같은 값을 반환해야한다.
    2.  함수의 출력은 반드시 함수가 받은 인자(Input)에만 영향을 받는다.
    3.  함수의 외부의 어떤 상태도 바꾸지 않는다.

     

    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 ] 일급 객체

    일급 개체는 아래 조건들을 만족해야합니다.

    함수가 일급 객체일 경우 일급함수라고 할 수 있습니다.

     

    1.  함수의 인자로 전달할 수 있어야한다.
    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
    }

    라는 함수를 만들어 보았다. 각각의 특성을 확인해주는 함수들을 받아 어떤 수가 그 특성들을 갖는지 확인할 수있는 함수이다.

    순수함수가 함수형 프로그래밍이 기본이라면 고차함수는 함수형프로그래밍에 꽃같은 느낌이었다.

     

     

    프로그래밍 패러다임에 따라 장단점이 있고 서비스에 특징에 맞게 프로그래밍 패러다임을 선택해서 사용할 수 있다면 매우 유용하겠다.
    또 큰 서비스 안에서도 내부적으로 그 특징에 맞게 또 다른 패러다임을 이용하는 것도 좋겠다.

    댓글

Designed by Tistory.