함수형 프로그래밍

이창민·2021년 12월 15일
0

코틀린 특징

  • 코틀린은 함수형 프로그래밍과 객체 지향 프로그래밍을 모두 지원하는 다중 패러다임 언어
    • 두 프로그래밍의 장점은 코드를 간략하게 만들 수 있음
    • 함수형 프로그래밍은 코드가 간략화되고 테스트나 재사용성이 더 좋아지면서 개발 생상성 증가

함수형 프로그래밍(FP)

순수 함수를 작성해 프로그램의 부작용 줄이는 프로그래밍 기법
람다식과 고차 함수를 사용
정의와 특징
1. 순수 함수 사용해야 함
2. 람다식 사용 가능
3. 고차 함수 사용 가능

순수 함수

어떤 함수가 같은 인자에 대해 항상 같은 결과를 반환하면 '부작용 x 함수'
이 함수가 함수 외부의 어떤 상태도 바꾸지 않으면 순수 함수라고 부름
-> 부작용이 없기 때문에 스레드에 사용해도 안전하고 코드 테스트 쉬움

fun sum(a: Int, b: Int): Int{
    return a+b 
}

위 코드의 sum 함수는 항상 동일한 인자인 a, b를 입력받아 항상 a+b를 return함(부작용x)

순수 함수가 아닌 것?

fun check(){
    val test = User.grade() // check() 함수에 없는 외부 User 객체 사용
    if(test != null) process(test) // 변수 test는 User.grade()의 결과에 따라 다름

위 코드는 check() 함수에 없는 외부의 User 객체의 함수인 grade()를 실행하고 grade()의 결과를 test에 저장해 if문에서 사용함
-> check 함수만 보면 User가 어떤 객체인지, grade()는 어떤 값을 반환하는지, process() 함수는 무슨 기능을 하는지 알 수 없음. 즉, check() 함수의 실행 결과를 예측하기 어려움
이런 함수가 순수 함수의 조건을 만족하지 못함

람다식

{ x, y -> x + y }

위 식은 함수 이름이 없고 화살표가 사용됨.
수학에서 말하는 람다 대수는 이름이 없는 함수로 2개 이상의 입력을 1개의 출력으로 단순화하는 개념

변수에 람다식을 할당할 수 있음

fun main(){
    var result = 0
    // 변수에 람다식 할당, 아래 주석으로 바꿔도 가능
    val multi = { x: Int, y: Int -> x * y } // val mutli: (Int, Int) -> Int = {x:Int, y:Int -> x*y}
    result = multi(10, 20) // 람다식 할당된 변수는 함수처럼 사용 가능
	println(result) // 200 출력됨
}

multi의 주석을 보면 val mutli: (Int, Int) -> Int = {x:Int, y:Int -> x*y}이 있다.
이는 생략하지 않은 전체 표현이다.

인자와 반환값이 없는 람다식

fun main(){
    val out: () -> Unit = {println("HelloKotlin")} // 인자, 반환값 없는 람다식 선언
    out() // 함수처럼 사용
    val new = out
    new()
}

위 코드의 출력 결과는 아래와 같다.

HelloKotlin
HelloKotlin

위 out 함수는 val out = { println("HelloKotlin")} 으로 바껴도 된다.
알아서 Unit 으로 추론한다.

일급 객체

FP에서는 함수를 일급 객체로 생각, 람다식 또한 일급 객체의 특징을 가짐
일급 객체 특징
1. 함수의 인자로 전달 가능
2. 함수의 반환값에 사용 가능
3. 변수에 담을 수 있음

만약 함수가 일급 객체면 일급 함수라고 부름 이름이 없는 경우 람다식이다.
즉, 람다식은 일급 객체의 특징을 가진 이름 없는 함수

고차 함수

다른 함수를 인자로 사용하거나 함수를 결괏값으로 반환하는 함수
두 특징 모두 가지고 있어도 고차함수
일급 객체나 일급 함수를 서로 주고받을 수 있는 함수가 고차함수가 됨
고차함수의 예

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을 람다식 함수 형식으로 선언함
즉, highFunc() 함수는 sum을 통해 람다식 함수를 인자로 받아들일 수 있는 고차 함수

출처자료

do it 코틀린 프로그래밍

profile
android 를 공부해보아요

0개의 댓글