
함수형 프로그래밍은 수학적 함수를 기반으로 하는 프로그래밍 패러다임입니다. 주요 특징으로는 불변성(Immutable), 순수 함수(Pure Function), 참조 투명성(Referential Transparency) 등이 있습니다. FP는 프로그램의 상태 변화를 최소화하고, 부작용(Side Effects)을 없애며, 함수의 재사용성을 높이는 것을 목표로 합니다.

참조 투명성이란 동일한 입력에 대해 항상 동일한 출력을 반환하는 특성을 의미합니다. 즉, 프로그램의 어떤 부분에서도 동일한 표현식이 동일한 값을 반환하는 것을 말합니다. 이를 통해 코드를 더 쉽게 예측하고 테스트할 수 있습니다.
순수 함수는 부작용이 없고, 동일한 입력에 대해 항상 동일한 출력을 반환하는 함수입니다. 부작용이 없다는 것은 함수가 외부 상태를 변경하지 않으며, 함수 외부의 상태에 의존하지 않는다는 것을 의미합니다.
fun add(a: Int, b: Int): Int {
return a + b
}
위 함수 add는 순수 함수입니다. 입력값이 같으면 항상 같은 결과를 반환하며, 외부 상태를 변경하지 않습니다.
순수 함수의 장점
1. 테스트 용이성: 동일한 입력에 대해 항상 동일한 출력을 반환하므로 테스트하기 쉽습니다.
2. 디버깅 용이성: 외부 상태에 의존하지 않으므로 함수 내부의 로직만 디버깅하면 됩니다.
3. 병렬 처리 용이성: 부작용이 없으므로 병렬로 실행해도 안전합니다.
고차 함수는 다른 함수를 인자로 받거나 함수를 반환하는 함수입니다. 고차 함수는 함수형 프로그래밍의 핵심 개념 중 하나로, 코드를 더 유연하고 재사용 가능하게 만듭니다.
fun applyOperation(a: Int, b: Int, operation: (Int, Int) -> Int): Int {
return operation(a, b)
}
fun main() {
val sum = applyOperation(5, 3, ::add)
println(sum) // 8
}
위 예제에서 applyOperation 함수는 두 숫자와 함수 operation을 인자로 받아, 해당 연산을 수행합니다.
고차 함수의 장점
1. 코드의 유연성 증가: 함수를 인자로 받거나 반환함으로써 더 유연한 코드를 작성할 수 있습니다.
2. 코드의 재사용성 증가: 공통 로직을 고차 함수로 추출하여 재사용할 수 있습니다.
코틀린에서 컬렉션은 데이터를 모아놓은 구조로, 리스트(List), 셋(Set), 맵(Map) 등이 있습니다. FP에서는 컬렉션을 처리할 때 주로 불변 컬렉션을 사용합니다. 코틀린에서는 List 인터페이스를 통해 불변 리스트를 제공합니다.
val numbers: List<Int> = listOf(1, 2, 3, 4, 5)
val mutableNumbers: MutableList<Int> = mutableListOf(1, 2, 3, 4, 5)
불변 컬렉션의 장점
1. 안전성: 데이터 변경으로 인한 부작용이 없으므로 안전합니다.
2. 예측 가능성: 데이터가 변경되지 않으므로 코드의 동작을 예측하기 쉽습니다.
compareTo 함수코틀린에서 객체를 비교할 때 compareTo 함수를 사용합니다. 이 함수는 Comparable 인터페이스를 구현하며, 객체의 자연 순서를 정의합니다.
data class Person(val name: String, val age: Int) : Comparable<Person> {
override fun compareTo(other: Person): Int {
return this.age - other.age
}
}
fun main() {
val people = listOf(Person("Alice", 30), Person("Bob", 25))
val sortedPeople = people.sorted()
println(sortedPeople) // [Person(name=Bob, age=25), Person(name=Alice, age=30)]
}
코틀린에서는 배열(Array)과 리스트(List)를 사용하여 데이터를 저장하고 처리할 수 있습니다. 배열은 고정 크기의 데이터 구조이며, 리스트는 가변 크기의 데이터 구조입니다.
val array: Array<Int> = arrayOf(1, 2, 3, 4, 5)
val list: List<Int> = listOf(1, 2, 3, 4, 5)
배열과 리스트의 차이점