Kotlin - 함수형 프로그래밍

Updated:

  • 함수형 프로그래밍

    • 함수형 프로그래밍(Funtional Programming) : 자료 처리를 수학적 함수의 계산으로 취급하고 상태와 가변 데이터를 멀리하는 프로그래밍 패러다임의 하나이다.(출처) 함수의 유기적 연결 및 동작이 최우선이 되는 프로그래밍 방식으로 함수가 일급 객체로써의 의미를 가지고 순수함수를 이용. ex) Kotlin, Python, Javascript

      • 일급 객체 : 일급 객체(영어: first-class object)란 다른 객체들에 일반적으로 적용 가능한 연산을 모두 지원하는 객체를 가리킨다. 보통 함수에 매개변수로 넘기기, 수정하기, 변수에 대입하기와 같은 연산을 지원할 때 일급 객체라고 한다.(출처)
      • 순수함수 : 동일한 인자를 넣었을 떄 항상 동일한 return value를 반환하고, 외부에 영향을 받지 않는 함수
      //순수 함수
      fun sum(a:Int, b:Int) = a+b
          
      //비순수 함수
      var a = 1
      fun sum(b:Int, c:Int) = a+b+c
      
    • 함수 정의

      fun 이름([변수이름 : 자료형, 변수이름: 자료형...]) : [return value 자료형]{
        표현 
        [return value]
      }
          
      //예시
      fun sum(a:Int, b:Int): Int{
        return a+b
      }
          
      fun sum(a:Int, b:Int) = a+b
      
      • 반환값은 생략 될 수 있으며, 반환값의 자료형을 Unit으로 지정하거나 생략(void 와 같음)
    • 매개변수

      //default 값을 지정하면 인자 전달을 하지 않고도 함수 실행이 가능
      fun add(name:String, email:String = "default"){
        //name & email을 저장
      }
      ...
      add("GilDong") //email을 생략하여 호출
          
          
      //이름과 함께 호출도 가능하다
      fun add3(x:Int = 100, y:Int = 200, z:Int = 300) = x+y+z
      add3(x = 200, y = 300)
          
      //가변 인자를 가진 함수는 'vararg' 를 이용하여 입력을 받을 수 있다.
      fun main(args:Array<String>){
      	normalVarargs(1,2,3)
        normalVarargs(1,2,3,4,5,6)
      }
          
        normalVarargs(vararg counts:Int){
          for(num in counts)
          	println("$num")
          print("\n")
        }
      
    • 예제 - 평균 구하기

      fun avgFunc(initial: Float, vararg numbers:Float): Double{
        var result = 0f
        for(num in numbers){
          result += num
        }
        println("result : $result, number.size: ${numbers.size}")
        val avg = result/number.size
        return (initial + avg).toDouble()
      }
          
      fun main(){
        val result = avgFunc(5f, 100f, 90f, 80f)//첫번째 인자 : 초기값, 이후 인자는 가변 인자
        println("avg result:$result")
      }
      
    • 람다식 : 익명 함수를 지칭하는 용어, 코드의 간결함을 위해 사용된다.

      • 문법 : (매개변수 목록) -> {실행문}
      • {} 로 감싸고, 인자는 () 로 감싸지 않는다.
      • 변수에 람다식을 담을경우 인자의 타입을 생략 불가능.
      • 인자는 형식 추론이 가능하므로 타입 생략 가능.
      val result = {x:Int, y:Int -> x+y}
          
      print(result(2,3))
      
    • 고차함수 : 다른함수를 인자로 사용하거나, 함수를 결괏값으로 반환하는 함수. 일급객체 혹은 일급 함수를 서로 주고 받을 수 있는 함수가 고차함수가 된다. (출처)

      fun main(){
        println(highFun({x,y -> x+y}, 10, 20))
           
      }
      fun highFun(sum:(Int, Int)->Int, a:Int, b:Int):Int = sum(a,b)
          
          
          
          
      //함수 참조는 참조연산자 `::` 이용 가능하다.
      fun Fun1(input:(String) -> String){
        val result = input("a")
        println(result)
      }
          
      fun Fun2(input:String) : String{
        println(input)
        return str.toUpperCase()
      }
          
      fun main(){
        Fun1(::Fun2)
      }
      //result
      a
      A