[코틀린기초] 8. 함수형 프로그래밍
순수 함수
부작용이 없는 함수.
동일한 입력인자에 대해서는 항상 같은 결과를 출력 혹은 반환.
값이 예측이 가능하여 결정적(deterministic)이다.
순수함수의 조건
- 같은 인자에 대하여 항상 같은 값을 반환
- 함수 외부의 어떤 상태도 바꾸지 않는다
fun check(){
val test = User.grade() // check함수에 없는 외부 객체 사용
}
위와 같은 함수는 User.grade()의 실행 결과에 따라 달라질 수 있으므로 순수함수 x
순수함수를 왜 사용할까?
-
입력과 내용을 분리하여 모듈화하므로 재사용성 up
-
병행작업 시에 안전하다
-
함수 값을 추적하고 예측할 수 있어 테스트나 디버깅에 유용
-
함수형 프로그래밍에 적용하기 용이. 함수를 매개변수나 반환값으로 사용할 수 있고 변수에도 저장가능. 유연성 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}
왜 함수형 프로그래밍을 하는가?
- 프로그래밍을 모듈화하여 디버깅 및 테스트 용이
- 간략한 표현식으로 생산성 up
- 람다식과 고차함수를 이용해 다양한 함수 조합 가능
정리
함수형 프로그래밍은 순수 함수를 조합하여 부작용이 없는 루틴을 만들어 내며,
람다식을 이용해 함수를 인자 및 반화값 등에 활용하는 고차 함수를 구성해 생산성을 높인 프로그래밍 방법이다.