-
[Kotlin] 함수형 프로그래밍 파헤치기Kotlin 2022. 6. 17. 00:38728x90반응형
함수형 프로그래밍이란?🤷🏻♂️
하나의 프로그래밍 패러다임으로 정의되는 일련의 코딩 접근 방식이며, 자료처리를 수학적 함수의 계산으로 취급하고 상태와 가변 데이터를 지양하는 프로그래밍 패러다임을 의미합니다.
함수형 프로그래밍 언어로는 클로저, 스칼라, 하스켈 등의 언어가 있으며, 파이썬, 코틀린, 자바스크립트 등에도 최근 버전에 함수형 프로그래밍 문법이 추가 되었습니다.
함수형 프로그래밍의 특징🔥
1. 순수 함수 (Pure Function)
- 동일한 입력에는 항상 같은 값을 반환해야 하는 함수
- 함수의 실행이 프로그램의 실행에 영향을 미치지 않아야 하는 함수
- 함수 내부에서 인자의 값을 변경하거나 프로그램 상태를 변경하는 Side Effect(부작용)가 없는 함수
val num = 1 fun sum(a : Int) : Int{ return a+num }
위 코드는 sum(a : Int)라는 함수에서 외부 요소인 전역 변수 num 을 참조하기 때문에 순수 함수라고 볼 수 없습니다🙅🏻♂️
fun sum(a : Int, b : Int) : Int { return a+b }
위 코드처럼 sum(a : Int, b: Int) 의 함수가 프로그램 실행에 영향을 미치지 않고 입력 값에 대해서만 값의 변환이 있으므로 순수 함수입니다.
순수 함수는 프로그램의 변화 없이 입력 값에 대한 결과를 예상할 수 있어 테스트가 용이합니다.
입력과 내용을 분리하고 모듈화 하므로 재사용성이 높아집니다.2. 비 상태, 불변성 (Stateless, Immutability)
- 함수형 프로그래밍에서의 데이터는 변하지 않는 불변성을 유지해야 합니다.
- 데이터의 변경이 필요한 경우, 원본 데이터 구조를 변경하지 않고 그 데이터의 복사본을 만들어서 그 일부를 변경하고, 변경한 복사본을 사용해 작업을 진행합니다.
val person = Person(name = "zibro", age = 26) fun happyNewYear(person : Person) : Person { person.age = person.age+1 return person }
위 코드는 happyNewYear(person : Person) 함수에서 전역으로 선언된 person의 age 속성을 변경하므로 불변성 유지를 만족하지 못합니다.🙅🏻♂️
val person = Person(name = "zibro",age = 26) fun happyNewYear(person : Person) : Person { return Person(name = person.name, age = person.age+1) }
위 코드처럼 객체의 값을 바꾸기 위해서는 데이터의 복사본을 만들어, 그 복사본을 사용해 작업을 진행하고 반환합니다.
3. 선언형 함수 (Declarations)
명령형 프로그래밍은 무엇을 어떻게 할 것인가에 주목하고, 선언형 프로그래밍은 무엇을 할 것인가에 주목합니다.
val numbers = arrayOf(1,2,3) fun multiple(numbers:Array<Int>,multiplier : Int){ for(i in 0 until numbers.size){ numbers[i] = numbers[i] * multiplier } }
위 코드는 for문을 사용해 배열의 각 요소를 multiplier 값을 곱해주는 명령형 프로그래밍의 예시입니다.
함수형 프로그래밍에서는 if, switch,for 등 명령문을 사용하지 않고 함수형 코드로 사용합니다.
val numbers = arrayOf(1,2,3) fun multiple(numbers:Array<Int>,multiplier : Int) : IntArray{ return numbers.map { it * multiplier }.toIntArray() }
위 코드는 for문을 map 으로 대치하였고, Kotlin에서는 filter, map, take, reduce 등 함수형 코드를 지원합니다.
4. 1급 객체와 고차 함수 (First-Class, Higher-Order Functions)
함수형 프로그래밍에서는 함수가 1급 객체가 됩니다. 또한 고차 함수의 속성을 가져야 합니다.
1급 객체
- 변수나 데이터 구조안에 담을 수 있습니다.
- 파라미터로 전달할 수 있습니다.
- 반환 값으로 사용할 수 있습니다.
- 할당에 사용된 이름과 무관하게 고유한 구별이 가능합니다.
- 동적으로 프로퍼티 할당이 가능합니다.
고차 함수
- 함수를 인자로써 전달할 수 있어야 합니다.
- 함수의 반환 값으로 또 다른 함수를 사용할 수 있습니다.
fun main(){ print(highFunc({a, b -> a + b}, 10, 20)) } fun highFunc(sum: (Int, Int) -> Int, a:Int, b:Int) : Int{ return sum(a,b) }
위 코드처럼 함수의 반환 값으로 다른 함수를 사용하거나, 함수의 반환 값으로 또 다른 함수를 사용 할 수 있어야 합니다.
함수형 프로그래밍의 장단점🚀
장점
- 높은 수준의 추상화를 제공
- 함수 단위의 코드 재사용이 수월
- 불변성을 지향하기 때문에 프로그램의 동작을 예측 수월
단점
- 순수 함수를 구현하기 위해서는 코드의 가독성이 좋지 않을 수 있음
- 함수형 프로그래밍에서는 반복이 for문이 아닌 재귀를 통해 이루어지는데 (deep copy), 재귀적 코드 스타일은 무한 루프에 빠질 수 있음
- 순수함수를 사용하는 것은 쉬울 수 있지만 조합하는 것은 쉽지 않음
반응형출처
https://jongminfire.dev/함수형-프로그래밍이란728x90반응형'Kotlin' 카테고리의 다른 글
[Kotlin] invoke 함수 (0) 2025.01.15