순수함수란 함수의 반환 값이 그 입력 값에만 의존하고, 프로그램의 다른 상태에 의존하지 않는 함수입니다.
또한 동일한 입력에 대해 항상 동일한 출력을 제공합니다.
Swift에서 순수 함수를 적극적으로 사용하면 코드의 가독성, 유지보수성, 그리고 안정성을 크게 향상시킬 수 있습니다.
오늘은 순수 함수의 두 가장 중요한 특성에 대해 알아보고, 왜 이러한 특성이 중요한지 알아보도록 할게요.
같은 인자로 함수를 호출했을 때, 항상 같은 결과를 반환합니다. 함수의 결과는 오로지 입력 값에만 의존합니다.
함수의 실행 결과는 오로지 그 함수의 입력 값에만 의존합니다. 동일한 입력에 대해 함수를 여러 번 호출하더라도, 매번 동일한 결과가 반환되어야 합니다.
이는 함수 내부에 랜덤 값 생성, 전역 변수 읽기, 혹은 시간과 같은 변할 수 있는 외부 환경에 의존하지 않는다는 것을 의미합니다.
사이드 이펙트가 발생하지 않는다는 것은, 함수가 외부의 어떤 상태도 변경하지 않는다는 것을 의미합니다.
함수는 주어진 입력을 기반으로 값을 계산하고 반환할 뿐 전역 변수를 수정하거나, 파일 시스템에 접근하여 데이터를 변경하거나
네트워크 요청을 보내는 등의 외부 상태에 영향을 주는 작업을 수행하지 않습니다.
func add(_ a: Int, _ b: Int) -> Int {
return a + b
}
위의 add
함수는 순수 함수입니다.
같은 입력 값(ex: 2와 3)에 대해 항상 같은 출력 값(5)을 반환하며, 함수 외부에 어떠한 영향도 미치지 않습니다.
var externalValue = 10
func addToExternalValue(_ a: Int) -> Int {
externalValue += a // 외부 상태를 변경
return externalValue
}
addToExternalValue
함수는 순수 함수가 아닙니다.
이 함수는 외부 변수 externalValue
를 변경하기 때문에, 같은 입력 값이라도 외부 변수의 상태에 따라 다른 결과를 반환할 수 있기 때문입니다.
위의 두 예제를 비교해보면, addToExternalValue
함수와 add
함수 사이에 중요한 차이점이 있습니다.
addToExternalValue
함수는 외부에 정의된 변수 externalValue
를 사용하고 있습니다.
이 함수는 입력 값에 따라 externalValue
의 값을 변경합니다.
이는 함수가 외부 상태에 의존하고 있으며, 외부 상태를 변경한다는 것을 의미합니다.
따라서, 같은 인자로 함수를 여러 번 호출하더라도, 외부 상태 externalValue
의 현재 값에 따라 결과가 달라질 수 있습니다.
예를 들어, addToExternalValue(5)
를 처음 호출하면 결과는 15일 수 있지만, 만약 외부에서 externalValue
가 변경되고 다시 호출하면 20이 될 수 있습니다.
이런 특성 때문에, addToExternalValue
는 순수 함수라고 할 수 없습니다.
반면, add 함수는 오로지 입력으로 주어진 인자들에만 의존하여 결과를 계산합니다.
이 함수는 외부의 어떤 상태에도 의존하지 않으며, 외부 상태를 변경하지도 않습니다. 결과적으로, add(2, 3)을 호출하면 항상 5를 반환합니다,
이는 함수가 호출되는 컨텍스트와 관계없이 일관된 결과를 제공한다는 것을 의미합니다. 이러한 특성은 함수의 예측 가능성과 테스트 용이성을 보장합니다.
따라서, 순수 함수를 사용함으로써 우리는 프로그램의 예측 가능성을 높이고, 사이드 이펙트로 인한 잠재적인 버그를 줄일 수 있습니다.
순수 함수는 프로그램의 다른 부분과의 상호 작용 없이 독립적으로 작동하기 때문에, 코드를 이해하고 디버그하는 데 있어 더 명확한 이점을 제공합니다.
순수 함수의 사용은 코드의 가독성을 높이고, 버그를 줄이며, 전체적인 프로그램의 안정성을 보장합니다.
따라서, 가능한 한 순수 함수를 사용하려고 노력하고, 함수가 외부 상태에 의존하거나 변경하지 않도록 노력해야 합니다.
코드를 작성할 때마다 '이 함수는 정말 순수한가?'를 스스로에게 물어보는 습관을 들이면 더 나은 소프트웨어 개발자로 성장하는 데 큰 도움이 되지 않을까요?