함수형 프로그램은 순수 함수를 작성하여 프로그램의 부작용을 줄이는 프로그래밍 기법을 말한다.
그리고 함수형 프로그래밍에서는 람다식과 고차 함수를 사용한다.
- 같은 인자에 대하여 항상 같은 값을 반환한다.
- 함수 외부의 어떤 상태도 바꾸지 않는다.
fun sum(a : Int, b : Int) : Int{
return a + b
}
위 함수는 동일한 인자 a, b에 대해서는 항상 같은 값을 반환하며 함수 외부의 어떤 상태도 바꾸지 않기 때문에 순수 함수이다.
프로젝트가 커지다보면 부작용을 완벽하게 통제할 수 있는 순수 함수를 만들기는 어렵다. 그래서 평소에 가능한 한 순수 함수에 가깝게 안전한 함수를 구현하려고 노력하는 것이 중요하다.
- 일급 객체는 함수의 인자로 전달할 수 있다.
- 일급 객체는 함수의 반환값에 사용할 수 있다.
- 일급 객체는 변수에 담을 수 있다.
함수형 프로그래밍에서는 함수를 일급 객체로 생각한다.
뒤에 나올 람다식 역시 일급 객체의 특징을 가지고 있다.
만약 함수가 일급 객체면 일급 함수라고 부른다. 그리고 일급 함수에 이름이 없는 경우 '람다식 함수' 혹은 '람다식'이라고 부를 수 있다. 즉, 람다식은 일급 객체의 특징을 가진 이름 없는 함수이다.
{ x, y -> x + y }
위의 식은 람다식의 예이다.
함수의 이름이 없고 화살표(->)가 사용되었다.
이 두가지가 람다식임을 알 수 있게 하는 특징이다.
위에서 일급 객체에 대해 말할 때 람다식에 대해 언급했다.
이름이 없는 일급 함수 == 람다식
위 함수는 보다시피 이름이 없다!
함수형 프로그래밍의 람다식은 다음과 같다.
- 다른 함수의 인자로 넘기는 함수
- 함수의 결괏값으로 반환하는 함수
- 변수에 저장하는 함수
그러나 아직 위의 예시로는 다른 함수의 인자, 결과값이 되는지 알 수 없고 변수에 저장되는지도 알 수 없으니 고차함수를 보면서 천천히 이해해보도록 하자.
- 다른 함수를 인자로 사용하는 함수
- 다른 함수를 결괏값으로 반환하는 함수
fun main(){
println(highFunc({ x, y -> x + y}, 10, 20)
}
fun highFunc(sum: (Int, Int) -> Int, a : Int, b : Int) : Int = sum(a, b)
위 예시를 보면 highFunc()
함수는 sum
이라는 매개변수가 있다. 그리고 이 sum
의 자료형은 람다식 형태이다.
즉, highFunc()
함수는 sum
이라는 변수에 람다식을 저장하여 람다식 함수를 인자로 받아들일 수 있는 고차 함수인 것이다.
이제 람다식에 대해서도 조금 더 감이 올 것이다.
- 순수 함수를 사용해야 한다.
- 람다식을 사용할 수 있다.
- 고차 함수를 사용할 수 있다.