[Kotlin] 3-2. 함수형 프로그래밍 패러다임

leeeha·2022년 6월 21일
0

코틀린

목록 보기
9/29
post-thumbnail

출처: https://www.boostcourse.org/mo132/lecture/59974

함수형 프로그래밍

코틀린은 다중 패러다임 언어!

  • 함수형 프로그래밍 (Functional Programming)
  • 객체지향 프로그래밍 (OOP, Object-Oriented Programming)

함수형 프로그래밍의 특징

  • 코드 간략화, 테스트나 재사용성 증가
  • 람다식 (Lambda Expression), 고차 함수 (Higher-Order Function)를 사용해 구성
  • 순수 함수 (Pure Function) 사용

순수 함수(Pure Function)

순수 함수란?

부작용 (side-effect)이 없는 함수

  • 동일한 입력에 대해 항상 같은 결과를 반환한다. (입력이 같은데 다른 결과가 나오면 그건 부작용이 있는 함수)
  • 값이 예측 가능해 결정적 (deterministic)이다.

순수 함수의 조건

  • 같은 인자에 대하여 항상 같은 값을 반환한다.
  • 함수 외부의 어떤 상태도 바꾸지 않는다.

그렇다면, 순수 함수가 아닌 것은?

fun check(){
    val test = User.grade() // 외부 객체 User 사용
    if(test != null) process(test) 
}

check() 함수 외부에 정의된 User 객체의 상태에 따라, check 함수의 반환 값이 달라질 수 있다. 또한, User 객체의 grade() 함수에 의해 외부 상태가 변경되는 부작용이 발생할 수도 있다. 따라서, check() 함수는 순수 함수가 아니다.

package chap03.section2

const val global = 10

fun main() {
    val num1 = 10
    val num2 = 3
    val result = foo(num1, num2)
    println(result)
}

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

foo 함수의 입력값과 무관하게 전역 변수에 따라 함수의 반환값이 달라질 수 있다. 따라서 foo 함수는 순수 함수가 아니다.

왜 순수 함수를 사용할까?

  • 입력과 내용을 분리하고 모듈화하므로 재사용성이 높아진다. (여러가지 함수와 조합해도 부작용이 없다.)
  • 특정 상태에 영향을 주지 않으므로 병렬 작업 시 안전하다.
  • 함수의 값을 추적하고 예측할 수 있기 때문에 테스트 및 디버깅에 유리하다.

함수형 프로그래밍에 적용

  • 함수를 변수나 자료구조에 저장
  • 함수를 매개변수나 리턴 값으로 사용 (이런 걸 '고차 함수'라고 부른다.)

이를 통해 프로그래밍의 유연성이 증가한다.

람다식 (Lambda Expression)

람다식이란?

  • 익명 함수의 한 형태로 이름 없이 사용하고 실행할 수 있는 식!
  • 람다 대수라는 수학적 개념에서 유래 (보통 수학에서 말하는 람다 대수는, 이름을 가질 필요가 없으며 두 개 이상의 입력이 있는 함수는 하나의 입력으로 단순화 할 수 있다는 개념이다.)

람다식의 예 (이름이 없는 함수 형태)
👉 { x, y -> x + y }

람다식의 이용

람다식은 고차 함수에서 인자로 넘기거나 결과 값으로 반환할 수 있다.

일급 객체 (First-Class Citizen)

일급 객체란?

  • 마치 '1등석'처럼 객체가 갖는 권한이 많아지는 것!
  • 일급 객체는 함수의 인자로 전달하거나, 함수의 리턴값으로 사용하거나, 변수에 담을 수도 있다.
  • 코틀린에서 함수는 1급 객체, 1급 함수로 다룬다.

고차 함수의 이해

고차 함수란?

고차 함수 (high-order function)란 다른 함수를 인자로 사용하거나 함수를 결과 값으로 반환하는 함수를 말한다. 물론 두 특징을 모두 가지고 있어도 고차 함수라고 얘기한다. 일급 객체 혹은 일급 함수를 서로 주고 받을 수 있는 함수가 고차 함수가 되는 것이다.

람다식을 함수의 가장 마지막 인자로 사용하면, 함수 호출 시 람다식의 중괄호를 밖으로 뺄 수 있다! 람다식의 내용이 길어지는 경우 이 방법이 편리하게 사용된다!

package chap03.section2

fun highFunc(a: Int, b: Int, sum: (Int, Int) -> Int): Int {
    return sum(a, b)
}

fun main() {
    //val result = highFunc(10, 20, { x, y -> x + y })
    val result = highFunc(10, 20) { x, y ->
        x + y
    } // 요렇게 중괄호를 밖으로 빼서 람다식을 작성할 수 있다! 
    println(result)
}

마무리

함수형 프로그래밍의 특징

  • 순수 함수를 사용해야 한다.
  • 람다식과 고차 함수를 사용할 수 있다.

왜 함수형 프로그래밍을 사용하는가!

  • 프로그램을 순수 함수로 모듈화 하기 때문에 테스트 및 디버깅이 더 쉬워짐.
  • 간략한 표현식을 사용하기 때문에 생산성이 높음.
  • 람다식과 고차함수로 다양한 함수 조합을 만들 수 있으므로 프로그램의 유연성이 증가함.

요약

함수형 프로그래밍은 순수 함수를 조합해 외부의 상태 변경이나 부작용이 없는 루틴을 만들어낸다. 그리고 이름 없는 함수 형태의 하나인 람다식을 이용해 함수를 (마치 변수처럼) 매개변수, 인자, 리턴값 등에 활용하는 고차 함수를 구성하여, 생산성을 높인 프로그래밍 방법이다!

profile
습관이 될 때까지 📝

0개의 댓글