Study/RxKotlin

[RxKotlin] 함수형 프로그래밍과 코틀린의 특징

hegunhee 2021. 10. 9. 15:25

위 글은 코틀린 리액티브 프로그래밍책을 보며 내용을 정리한 내용입니다.
책 : 코틀린 리액티브 프로그래밍
리부 차크라보티 지음
조승진 옮김

 

글을 시작하며..


함수형 프로그래밍 패러다임은 객체지향 프로그래밍(OOP와 약간 다르다.)
함수형 프로그래밍은 좀 더 선언적이고 표현적인 프로그램이고, 불변의 데이터를 사용하는 경향이 있다.
함수형 프로그래밍의 정의는 다음과 같다.

불변의 데이터를 사용한 수학적인 함수의 평가를 통해 프로그램을 구조화하는 동시에 상태 변화를 방지한다

이 예시에대해서는 코틀린의 특징을 알아보며 설명하겠습니다.

함수형 프로그래밍은 프로그래밍 논리를 작고 재사용 가능하며 선언적인 순수한 기능의 조각으로 나온다.
논리를 작은 코드로 분산시키면 쉽게 모듈화가 가능하고 단순해지기 때문에 다른 모듈에 영항을 끼치지 않고 특정 코드의 일부 또는 모든 부분을 리팩토링하거나 방지할 수 있다.
즉 자바의경우에는 공통된 작업이나 요소들을 객체로 묶었지만 코틀린에서는 잘게 쪼개서 함수로 담는다는 것이다.

 

함수형 프로그래밍의 기초

함수형 프로그래밍은 람다, 순수 함수, 고차 함수, 함수 유형, 인라인 함수 같은 몇 가지 새로운 개념으로 구성된다.

1. 람다표현식


람다 또는 람다식은 일반적으로 이름이 없는 익명함수를 의미한다. 람다식은 함수라고 말할 수 있지만 모든 함수가 람다식 인것은 아니다.

fun main(args :Array<String>){
    val minus = {x : Int, y:Int -> x - y} // (1)
    println("Minus ${minus(14,12)}")
    val anonymousSum = {x : Int -> (Random().nextInt(10)+1) * x}
    println("random output ${anonymousSum(3)}")
}

Minus = 2
random output 27

주석 (1)에서는 두 개의 숫자를 빼고 결과의 차를 반환하는 람다식을 선언한다.

여기서 주석 1의 minus를 봤을때 val minus라고 되어있는게 바로 불변성이다.

val은 값의 재할당이 불가능하고 var은 값의 재할당이 가능하다.
물론 배열의 값이나 List의 값은 다른 문제이다.

2. 순수함수


함수의 반환값이 인수/매개 변수에 전적으로 의존하면 이 함수를 순수 함수라고 한다.
그래서 (함수)를 선언하면 그 반환값은 인수 x에 전적으로 의존한다.
순수 함수는 람다 또는 명명한 함수일 수도 있다. 결과값이 인수에만 전적으로 의존한다고 보면 쉽다.
그리고 순수함수에는 인수에만 의존하므로 부작용(Side Effect)이 없다

3. 고차함수


함수를 인자로 받아들이거나 반환하는 함수를 고차함수(high order functions라고 부른다.

fun sayTo(name : String, helloFunc : (name : String) -> Unit){
    helloFunc(name)
}
fun hi(name : String){
    println("hi $name")
}
fun bye(name : String){
    println("bye $name")
}

fun main(args :Array<String>){
    sayTo("gunhee",{name : String -> hi(name)})
    sayTo("gunhee",{name : String -> bye(name)})
}
hi gunhee
buy gunhee

4. 인라인 함수


inline fun double(x : Int) : Int{
    return x *2
}
fun main(args : Array<String>){
    for(i in 1 until 10){
        println("$i Double ${double(i)}")
    }
}
1 Double 2
2 Double 4
3 Double 6
4 Double 8
5 Double 10
6 Double 12
7 Double 14
8 Double 16
9 Double 18

 

RxKotlin 첫 글입니다.

앞으로는 점점 더 나아지는 모습을 보여드리겠습니다.