[코틀린기초] 8. 함수형 프로그래밍

순수 함수

부작용이 없는 함수.

동일한 입력인자에 대해서는 항상 같은 결과를 출력 혹은 반환.

값이 예측이 가능하여 결정적(deterministic)이다.

순수함수의 조건

  1. 같은 인자에 대하여 항상 같은 값을 반환
  2. 함수 외부의 어떤 상태도 바꾸지 않는다
fun check(){  
  val test = User.grade() // check함수에 없는 외부 객체 사용  
}  

위와 같은 함수는 User.grade()의 실행 결과에 따라 달라질 수 있으므로 순수함수 x

순수함수를 왜 사용할까?

  1. 입력과 내용을 분리하여 모듈화하므로 재사용성 up

  2. 병행작업 시에 안전하다

  3. 함수 값을 추적하고 예측할 수 있어 테스트나 디버깅에 유용

  4. 함수형 프로그래밍에 적용하기 용이. 함수를 매개변수나 반환값으로 사용할 수 있고 변수에도 저장가능. 유연성 up

람다식

익명 함수의 하나의 형태로, 이름없이 사용 및 실행이 가능한 함수

고차 함수에서 인자로 넘기거나 반환이 가능하다.

{x , y -> x + y}  

일급 객체 (first class citizen)

일급 객체는 함수의 인자, 반환값으로 사용 가능하며 변수에 담을 수 있다.

코틀린에서 함수는 1급 객체로 다룸. 1급 함수라고도 한다

고차 함수 (high-order function)

함수를 인자로 받거나 반환하는 함수

fun highFunc(sum: (Int,Int) -> Int, a:Int, b:Int): Int = sum(a,b)  

highFunc({x,y -> x + y}, 10 ,20) 이런 식으로 호출 근데 이거보단
람다식을 매개변수의 마지막에 선언할 경우 () 안에서 빼내 밖에서 표현한다

 highFunc(10,20){x,y->x+y} //이렇게 람다식을 소괄호에서 분리하여 자주 사용한다  

인자가 하나라면 람다식 내부에서 it으로 받을 수 있다.
인자가 하나면서 그 인자가 람다라면 () 생략 가능

people.maxby({it.age}) -> people.maxby{it.age}  

왜 함수형 프로그래밍을 하는가?

  1. 프로그래밍을 모듈화하여 디버깅 및 테스트 용이
  2. 간략한 표현식으로 생산성 up
  3. 람다식과 고차함수를 이용해 다양한 함수 조합 가능

정리

함수형 프로그래밍은 순수 함수를 조합하여 부작용이 없는 루틴을 만들어 내며,
람다식을 이용해 함수를 인자 및 반화값 등에 활용하는 고차 함수를 구성해 생산성을 높인 프로그래밍 방법이다.