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

leeeha·2022년 6월 21일
0

코틀린

목록 보기
9/28
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() // check 함수에 없는 외부의 User 객체 사용
    if(test != null) process(test) // 변수 test는 User.grade()의 실행 결과에 따라 달라짐. 
}
package chap03.section2

const val global = 10

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

fun noPureFunction(a: Int, b: Int): Int {
    return a + b + global // 입력값과 무관하게 외부 변수에 따라 출력값이 달라짐.
}

왜 순수 함수를 사용할까?

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

함수형 프로그래밍에 적용

  • 함수를 매개변수, 인자, 혹은 리턴값에 적용 (이런 걸 '고차 함수'라고 부른다.)
  • 함수를 변수나 데이터 구조에 저장
  • ⭐ 유연성 증가

람다식 (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개의 댓글