함수형 프로그래밍은 프로그램의 구성 요소를 함수로 구성하고, 함수의 호출과 합성을 중심으로 하는 프로그래밍 패러다임입니다. 함수형 프로그래밍은 상태 변경을 피하고 데이터 불변성을 중시합니다. 이는 코드의 가독성을 높이고, 디버깅과 테스트를 용이하게 합니다.

람다 함수

람다 함수는 익명 함수로도 불리며, 이름이 없는 함수입니다. 이름이 없는데 이를 사용한다는 것은 함수가 변수에 대입되거나, 인자로 전달되거나, 심지어 리턴값으로 쓰일 수 있다는 것 아닐까요? 이 특징은 매우 중요한 특징으로, 이런 조건을 만족하는 객체를 일급 객체라 부릅니다. 코틀린에서 함수는 일급 객체로, 함수가 변수에 대입되거나, 인자로 전달되거나, 리턴값으로 쓰일 수 있습니다.

val sum = { x: Int, y: Int -> x + y }
println(sum(3, 5))  // 출력: 8

코틀린의 람다식은 입력 파라미터를 화살표 (>) 왼쪽에 위치시키고, 화살표 오른쪽에는 식을 위치시킵니다. 식의 마지막 결과값이 자동으로 반환됩니다.

val add5 = { x -> x + 5 }
val add5 = { it + 5 }

위 세 코드의 add5는 같은 의미입니다. 람다 함수에서도 타입 추론이 작동하며, 만일 람다 함수가 단일 변수만을 받는다면, 해당 구문을 생략하고 인자 it을 사용할 수 있습니다.

람다 함수의 타입은 (인자) → 리턴값(없으면 Unit)으로 표현할 수 있습니다. 예를 들어, 위의 add5 함수의 타입은 (Int) → Int입니다.

fun calculate(x: Int, y: Int, operation: (Int, Int) -> Int): Int {
    return operation(x, y)
}

fun add(x: Int, y: Int): Int {
		return x + y;
}

fun main() {
		val result = calculate(10, 20, ::add)
		println(result)  // 출력: 30
}

람다 함수와 같이 일반적인 fun으로 선언된 함수를 붙이기 위해서는 ::을 앞에 붙여야 합니다.

add 앞에 :: 을 붙인 것에 주목하세요. fun으로 선언된 함수는 앞에 이 구문을 붙여야 합니다. 만일 아래와 같이 람다식으로 정의됐다면, :: 을 붙이지 않아야 합니다.


순수 함수

순수 함수는 부작용이 없는 함수, 다시 말해 함수의 실행이 외부에 영향을 받거나 끼치지 않는 함수를 말합니다. 다시 말해, 함수의 연산이 전달된 인자만을 사용한다면, 이 함수는 순수 함수입니다. 예를 들어, 아래 함수들은 순수 함수들입니다.

val add5 = { x: Int -> x + 5 }
val add = { x: Int, y: Int -> x + y}

순수 함수는 외부의 영향을 받지 않기 때문에 매우 많은 최적화가 가능합니다.