Kotlin은 함수형, 객체지향 프로그밍을 모두 지원하는 다중 패러다임 언어이다. 다중 패러다임 언어란 한 가지 구현 규칙에 얽매이지 않고 다양한 문법과 형식을 지원하는 언어를 뜻한다. 하지만 그럴수록..제대로 알지 못하고 쓴다면 이도 저도 아닌 코드가 되기 십상이다 ㅠㅠ 그러므로 이제부턴 함수형 프로그래밍이 뭔지 알아보고, 이를 코드에 적용하는 힘을 길러보자.
함수형 프로그래밍이란 순수 함수를 작성하여 프로그램의 부작용을 줄이는 기법을 말하며 람다식과 고차함수를 사용할 수 있다. 싸늘하다... 첫 문장부터 뭐라는지 모르겠으니 보다 자세히 알아보자. 순수 함수, 람다식, 고차함수 이 세 가지를 정복해야만 함수형 프로그래밍의 정의를 알 수 있을 것 같으니 용어 하나하나 자세히 살펴보자.
함수형 프로그래밍의 정의 중 세 번째로 나온 단어, 순수 함수. 이걸 이해해야만 함수형 프로그래밍의 정의를 이해할 수 있을 것이다.
만일 어떤 함수가 같은 인자에 대해 항상 같은 결과를 반환하면 "부작용이 없는 함수" 라고 한다. 그리고 "부작용이 없는 함수"가 함수 외부의 어떤 상태도 바꾸지 않는다면 "순수 함수"라고 한다. 즉, 순수함수가 되려면 두 가지 조건을 만족해야 한다.
(1) 같은 인자에 대해 항상 같은 결과를 반환해야 하고
(2) 함수 외부의 어떤 상태도 바꾸지 않아야 한다.
=> 이러한 순수함수는
(1) 스레드에서도 안전하고
(2) 코드를 테스트하기 쉬우며
(3) 함수의 결과를 예측할 수 있다 는 특성을 가진다.
예시를 보자. 다음 함수는 a, b를 더해 그 값을 그대로 반환한다. 즉, 같은 값이 들어오면 항상 같은 결과를 내준다. 또한 함수 외부의 어떠한 변수의 값도 바꾸지 않는다. 이 함수가 바로 순수함수의 예이다.
fun sum(a: Int, b: Int): Int{
return a + b
}
사실 프로그램이 커지다 보면 부작용을 완벽히 통제 가능한 순수 함수를 만들기는 어렵다.. 그래도 최대한 순수함수에 가까운 함수를 구현해야 "함수형 프로그래밍"을 구현했다고 할 수 있다.
함수형 프로그래밍의 정의 중 첫 번째 단어인 순수 함수를 알게 되었다. 그럼 이제 람다식과 고차함수를 알아보자.
람다식은 람다대수에서 유래한 것으로, 람다대수란 이름이 없는 함수로 2개 이상의 입력을 받아 1개의 출력으로 단순화하는 수학 개념이다. 예시부터 보자.
{x, y -> x + y}
와 정말 간단하다. fun 키워드도 없고, 함수 이름도 없고 화살표만 있다. 이처럼 함수형 프로그래밍의 람다식은
(1) 다른 함수의 인자로 넘기는 함수
(2) 함수의 결과값으로 반환하는 함수
(3) 변수에 저장하는 함수
를 말한다.
근데, 앞서 말한 람다식의 정의 (1), (2), (3)은 일급 객체의 특징이다. 그럼 일급 객체는 뭐냐?
일급 객체 == 함수형 프로그래밍에서의 함수로, 다음 3가지 특징을 가진다.
(1) 다른 함수의 인자로 넘기는 함수
(2) 함수의 결과값으로 반환하는 함수
(3) 변수에 저장하는 함수
어라 이거 어디서 분명히 본 특징이다. 바로 위인 람다식에서 봤다.
Kotlin에서는 일급 객체인 함수를 일급 함수라 부르고, 일급 함수에 이름이 없으면 람다식이라 부른다. 즉, 일급 객체 >> 일급 함수 >> 람다식인 셈이다. 일급 객체의 3가지 특징을 만족하는 함수인데 이름이 없다면 바로 람다식인 것이다.
이제 두 번째 단어까지 왔다! 순수함수, 람다식이 뭔지 알았으니 마지막 고차함수에 대해 알아보자.
고차함수란
(1) 다른 함수를 인자로 사용하거나
(2) 함수를 결과값으로 반환하는 함수
를 말한다.
즉, 일급객체 / 일급 함수 / 람다식을 사용하는 주체가 바로 고차함수인 것이다. 예시를 보자.
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은 a와 b 인자를 받아서 더해버리는 람다식이다. 아까 람다식은 이름이 없다고 했는데, {x, y -> x + y} 요게 람다식인 것이고 sum은 highFunc에서 요 {x, y -> x + y} 람다식을 사용할 때 쓰는 "매개변수 이름" 이다.
정리!!!
함수형 프로그래밍의 정의는
(1) 순수함수로 작성해야 한다. (2) 람다식을 쓸 수 있다. (3) 고차함수를 쓸 수 있다.
여기서 (1)인 순수함수는 같은 인자에 대해 항상 같은 결과를 반환하면서 함수 외부의 어떤 상태도 바꾸지 않는 함수다.
(2)인 람다식은 2개 이상의 입력을 받아서 1개의 결과로 단순화하는 이름 없는 함수이되, 인자로 쓰일 수도 있고 반환값으로 쓰일 수도 있고 변수에 저장될 수도 있다.
(3)인 고차함수는 일급 객체 / 일급 함수 / (2)인 람다식을 사용하는 주체로, 함수를 인자나 결과값으로 사용한다.
한마디로 "함수형 프로그래밍"은 람다식, 고차함수를 잘 활용해서 순수함수 형태로 작성하는 프로그래밍 형식을 말한다. 이를 통해 프로그램의 부작용을 줄이고 테스트 코드 작성, 스레드 안전성 등의 장점을 택할 수 있는 것이다.
함수형 프로그래밍의 정의에 대해 알아보았다. 좀 너무 낯선 개념이라 용어 자체를 이해하는게 오래 걸렸지만, 딱 한줄로 람다식, 고차함수를 잘 활용해서 순수함수 형태로 작성하는 프로그래밍 형식 이라고 이해하면 될 것 같다. 다음 장부터는 본격적으로 각 함수들에 대해 알아보자!
이것이 안드로이드다 with Kotlin (고돈호 지음, 한빛미디어)