Pure Function

함수형 프로그램은 함수를 이용해서 프로그래밍을 합니다. 여기서 말하는 함수를 기존의 함수 또는 메소드와 구분하기 위해 순수함수라고 합니다. 이 순수함수는 '특정 input에 대해서 항상 동일한 output을 반환하는 함수'를 의미합니다. output을 만드는데 input만을 사용한다는 의미이므로, 함수 외부의 값을 사용하지 않아 side-effect가 없다는 뜻이 됩니다. - output은 input에 의해서만 결정됩니다. - 함수의 수행 과정에서 외부에 있는 값을 사용하지 않습니다. - 그리고 외부의 값을 변경하지도 않습니다. - 그래서 순수함수는 외부에 영향을 주지도 받지도 않습니다. 즉, side-effect가 없습니다.
var name = "FP"
var greeting = ""
func makeGreeting() {
greeting = "Hello, \(name)"
}
예를 들어 이 소스에서는 함수의 동작이 외부에 있는 변수인 namegreeting에 의해 영향을 받습니다. Side-Effect가 존재합니다. 이것을 순수함수로 바꾼다면 이렇게 됩니다.
func greeting(_ name: String) -> String {
return "Hello, \(name)"
}
함수의 수행결과가 파라미터로 받은 name에 의해서만 결정되고, 외부에 영향을 전혀 받지 않습니다. 언제든 특정 입력값에 대해 항상 동일한 결과를 얻을 수 있습니다.
let greet = "Hello"
func greeting(_ name: String) -> String {
return "\(greet), \(name)"
}
만약 이런코드도 순수 함수 일까요? 결과를 만드는데 외부값인 greet 이라는 변수를 사용합니다. 하지만 이 값은 let으로 정의되어 있어 변경이 불가능한 값입니다. 이렇게 변경이 불가능한 데이터를 immutable data 라고 합니다. 그리고 이 immutable data 만 사용하는 함수도 특정 input에 대해 항상 동일 output을 내기 때문에 순수함수 입니다.
func add(_ a: Int) -> Int {
return Int(arc4random()) + a
}
이 함수는 순수 함수 입니까? 결과를 만드는데 외부값을 사용하지는 않지만, 내부에서 랜덤값을 사용해서 결과를 만들고 있기 때문에, 동일한 값을 입력하더라도 실행 때 마다 다른 결과를 얻게 됩니다. 따라서 이 함수는 순수함수가 아닙니다.

실습

주어진 코드에서 외부변수를 사용하지 않는 순수함수로 변경하세요
import Foundation

var sum = 0 //이 변수를 삭제하세요
func solution(_ nums: [Int]) -> Int {
    for i in nums {
        sum += i
    }
    return sum
}
직접 풀어보시고, 다음 페이지에서 솔루션 코드를 확인해보세요.