Pure Function
함수형 프로그래밍에서의 함수는 기존의 함수와 메서드와는 구분하기 위해서 순수함수라는 표현을 사용합니다.
순수함수는 ‘특정 input에 대해서 항상 동일한 output을 반환하는 함수’를 의미합니다.
순수함수는 부수효과(side-effect) 가 존재 하지 않습니다.
부수효과가 존재한다는 것은 함수가 내부에서 일처리를 함에 다른 추가적인 효과들이 발생하는 것입니다.
var sum = 0
func add(numbers:[Int]){
return numbers.reduce(sum,number)
}
위의 예 와 같이 add라는 함수는 sum이라는 외부의 값을 사용하는 경우도 부수효과가 발생합니다.
함수에 동일한 입력을 넣는다고 해도 , 참조하는 외부의 값이 다를 경우 , 다른 결과가 나올수 있게됩니다.
let sum = 0
func add(numbers:[Int]){
return numbers.reduce(sum,number)
}
위의 경우처럼 외부의 값이 let
으로 정의되어 있다면 사이드이펙트로 부터 자유로울 수 있겠습니다.
위의 경우 언제나 **동일한 Input 에 동일한 Output **을 뱉어 내기 때문에 순수함수입니다.
var sum = 0
func add(numbers:[Int]){
for number in numbers {
sum += number
}
return number
}
또 외부의값을 함수 내부에서 변경하고 있습니다.
이 또한 외부의 값을 변경하는 부수효과를 내고 있습니다.
func add(numbers:[Int]){
var sum = 0
for number in numbers {
sum += number
}
return number
}
변수를 내부로 옮김으로써 , 외부의 영향을 주지도 , 받지도 않게 되었습니다.
그로 인해 언제나 동일한 Input에 동일한 Output을 반환하게됩니다.
이로써 순수함수가 되었습니다.
func add(_ a: Int) -> Int {
return Int(arc4random()) + a
}
위의 경우는 외부의 영향을 주지도 , 받지도 않아 부수효과(side-effect) 에서는 자유로우나
동일한 Input에 Output을 반환하지 않습니다.
위의 경우는 순수함수로는 탈락입니다.