모르는 용어 정리

순수 함수란?

참깨빵위에참깨빵_ 2023. 2. 1. 00:37
728x90
반응형

코틀린은 함수형 프로그래밍을 지원하는 언어라고 흔히 말한다. 함수형 프로그래밍은 프로그램을 함수로 구성하는 프로그래밍 패러다임이다. 함수형 프로그래밍을 따를 경우 함수는 일급 시민으로 취급되어 함수가 변수로 사용되거나, 다른 함수에서 함수를 반환할 수 있다.

이 함수형 프로그래밍의 특징 중 하나가 순수 함수를 사용한다는 것이다. 그럼 순수 함수의 뜻은 무엇인가?

 

https://en.wikipedia.org/wiki/Pure_function

 

Pure function - Wikipedia

From Wikipedia, the free encyclopedia Program function without side effects and which returns identical values for identical arguments In computer programming, a pure function is a function that has the following properties:[1][2] the function return value

en.wikipedia.org

순수 함수는 다음 속성을 갖는 함수다

1. 함수의 리턴값은 동일한 인수에 대해 동일하다
2. 함수에 부작용(side effects)이 없다

 

위키백과의 말대로면 함수 매개변수로 뭘 넣든 출력값은 기대한 값을 반환해야 하고, 부작용이 없어야 한다.

그런데 side effect란 말은 개발 포스팅들을 보다 보면 한 번 본 기억이 있다. 저게 무슨 뜻인가?

 

https://en.wikipedia.org/wiki/Side_effect_(computer_science) 

 

Side effect (computer science) - Wikipedia

From Wikipedia, the free encyclopedia Of a function, an additional effect besides returning a value In computer science, an operation, function or expression is said to have a side effect if it modifies some state variable value(s) outside its local enviro

en.wikipedia.org

컴퓨터 과학에서 작업(operation), 함수 또는 표현식(expression)은 로컬 환경 외부에서 일부 상태 변수값(들)을 수정하는 경우 부작용이 있다고 한다. 부작용의 예로는 non-local 변수 수정, static local 변수 수정, 참조로 전달된 변경 가능한 인수 수정, I/O 수행, 부작용이 있는 다른 함수 호출 등이 있다. 부작용이 있으면 프로그램의 동작은 기록에 따라 달라질 수 있다. 부작용이 있는 함수를 이해하고 디버깅하려면 컨텍스트 및 가능한 이력에 대한 지식이 필요하다
부작용은 프로그래밍 언어의 설계, 분석에서 중요한 역할을 한다. 부작용이 사용되는 정도는 프로그래밍 패러다임에 따라 다르다. 예를 들어 명령형 프로그래밍은 일반적으로 부작용을 생성하고 시스템 상태를 업데이트하는 데 사용된다. 선언형 프로그래밍은 일반적으로 부작용 없이 시스템 상태를 보고하는 데 사용된다. 함수형 프로그래밍은 부작용을 최소화하거나 제거하는 걸 목표로 한다. 부작용이 없기 때문에 프로그램의 검증을 더 쉽게 할 수 있다...(중략)

 

로컬 환경이 뭘 뜻하고 로컬 환경의 변수는 뭔지 몰라서 이 내용이 정확히 뭔지 모르겠다. 다른 사람들의 설명을 확인해 봤다.

 

https://medium.com/@bharathkumarbachina/kotlin-pure-function-58d98e87efee

 

Kotlin: Pure function

Kotlin brings awesome feature to Android development. One of that is functional programming.

medium.com

함수가 순수하다고 하려면 아래의 특성들을 가져야 한다

- 숨겨진 정보나 외부 상태가 아닌 결과를 생성하는 입력에만 의존해야 한다
- 참조 또는 전역 변수 / 객체에 의해 전달된 매개변수를 수정하는 것과 같은 관찰 가능한 부작용을 일으키지 않아야 한다

< 순수 함수의 예 >
fun getSum(a:Int,b:Int):Int{
    return a+b
}
위 코드에서 a, b를 매개변수로 전달하고 외부 변수에 접근하지 않고 주어진 입력을 기반으로 계산을 수행한다
fun isValidAmount(amount: Double, max: Double): Boolean = amount < max
이 함수는 amount, max를 취하고 boolean을 반환한다

< 순수하지 않은 함수의 예 >
fun isValidAmount(amount:Double):Boolean{
    val max = getMax()
    return amount < max
}
이 함수는 최대값을 얻기 위해 일부 외부 상태에 의존한다. 이는 1번 규칙을 위반한다. 따라서 순수 함수가 아니다
val isValid = ObservableBoolean(false)
private fun checkValidity() {
    val isAllValid = fields.map { it.isValid.get() }.reduce { acc, b -> acc && b }
    isValid.set(isAllValid)
}
이 필드는 외부이며 함수 외부에 있는 Observable 필드를 수정한다. 따라서 이것은 순수 함수로 간주되지 않는다

 

https://gold.gitbook.io/kotlin/pure-function

 

Pure Function - kotlin

Pure Function, 순수함수라는 것은 어떠한 함수에 A 라는 입력을 했을때 횟수에 관계없이 언제나, 몇 번을 실행하더라도 같은 입력에는 같은 출력값이 나오는 함수를 말한다.

gold.gitbook.io

순수함수라는 건 어떤 함수에 A라는 입력을 줬을 때 횟수에 관계없이 언제나, 몇 번을 실행해도 같은 입력엔 같은 출력값이 나오는 함수를 말한다. 비순수함수는 순수함수보다 안전하지 못하다
// 순수함수의 예
fun pureFunction(str: String): String = str + "Test"

function("Kotlin")   // "KotlinTest"
function("Kotlin")   // "KotlinTest"
function("Kotlin")   // "KotlinTest"
function("Kotlin")   // "KotlinTest"

// 비 순수함수의 예
val sb = Stringbuilder()

fun nonPureFuction(str: String): String = str + sb.append("Test").toString()

println(nonPureFuction("Kotlin"))  //KotlinTest
println(nonPureFuction("Kotlin"))  //KotlinTestTest
println(nonPureFuction("Kotlin"))  //KotlinTestTestTest
println(nonPureFuction("Kotlin"))  //KotlinTestTestTestTest

 

https://jongminfire.dev/%ED%95%A8%EC%88%98%ED%98%95-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D%EC%9D%B4%EB%9E%80

 

함수형 프로그래밍이란?

jongminfire.dev

순수 함수

- 동일한 입력에는 항상 같은 값을 반환해야 하는 함수
- 함수 실행이 프로그램 실행에 영향을 주지 않아야 하는 함수
- 함수 내부에서 인자의 값을 변경하거나 프로그램 상태를 변경하는 side effect가 없는 것

 

다른 블로그들도 같거나 비슷한 말을 써 놔서 정리하면, 함수가 순수 함수라고 불리려면 만족해야 하는 조건이 최소 2가지 있다. 이걸 만족하는 함수는 순수 함수라고 이해했다.

 

  • 같은 입력을 주면 언제 어디서 몇 번 호출하더라도 같은 결과값을 리턴하는 함수
  • 함수 안에서 함수의 매개변수로 받은 값(외부 상태)이 변경되지 않는 함수
반응형