본문 바로가기
프로그래밍 패러다임/함수형 프로그래밍

Pure Function (순수 함수)

by 시니성 2023. 8. 28.

순수 함수는 주어진 입력에 대해 항상 동일한 출력을 반환하며, 외부 상태를 변경하지 않고 외부 상태에 의존하지도 않는 함수입니다.

순수 함수의 특징:

  1. 동일한 입력에 대한 동일한 출력: 동일한 인자가 주어졌을 때 항상 동일한 결과를 반환해야 합니다.
  2. 부작용(Side Effects)이 없음: 외부 상태를 변경하지 않아야 하며, 함수 내에서도 외부 상태에 의존해서는 안 됩니다.

Pure Function 예시:

// 순수 함수 예시
fun add(x: Int, y: Int): Int {
    return x + y
}

val result = add(3, 4)  // 항상 7을 반환

이 함수는 입력된 두 숫자의 합을 반환합니다. 외부의 어떤 상태에도 영향을 받지 않으며, 외부 상태를 변경하는 부작용도 없습니다.

Non-Pure Function 예시:

var count = 0  // 외부 변수

// 순수 함수가 아닌 예시
fun increment(): Int {
    count++  // 외부 변수의 상태를 변경
    return count
}

val newCount = increment()  // 호출할 때마다 값이 변경됨

이 함수는 count라는 외부 변수의 상태를 변경합니다. 따라서 같은 입력에 대해서도 다른 출력을 가질 수 있습니다. 또한 외부의 상태를 변경하는 부작용이 있습니다.

Non-Pure Function -> Pure Function으로 Refactoring:

count의 상태 변경이 필요하다면, 상태 변경을 외부에서 처리하도록 하여 increment 함수를 순수 함수로 만들 수 있습니다. 함수가 상태를 직접 변경하지 않도록 하면 순수 함수의 조건을 만족시킬 수 있습니다.

아래는 increment 함수를 순수 함수로 만든 예시입니다:

// 순수 함수로 작성된 increment
fun increment(value: Int): Int {
    return value + 1
}

val count = 0
val newCount = increment(count)  // 1

여기서 increment 함수는 주어진 값을 1만큼 증가시킨 결과를 반환합니다. 함수는 어떠한 외부 상태도 변경하지 않습니다. 상태의 변화가 필요할 경우, 그 변화는 함수의 호출자 측에서 처리해야 합니다.

Pure Function과 Side Effect의 관계

Side Effect (부작용)는 함수가 외부의 상태를 변경하거나, 함수 실행 결과가 외부 상태에 의존할 때 발생합니다. 예를 들어, 글로벌 변수를 변경하거나, 파일을 쓰기, 데이터베이스 상태를 변경하는 것들이 부작용에 해당합니다.

순수 함수는 부작용이 없어야 합니다. 즉, 순수 함수는 외부 상태를 변경하거나 외부 상태에 의존해서는 안 됩니다. 이런 특징 덕분에 순수 함수는 예측 가능하고 테스트하기 쉽습니다. 함수형 프로그래밍에서는 이러한 순수 함수의 개념을 중심으로 코드를 작성하며, 부작용을 최소화하려는 노력을 합니다.

요약하면, 순수 함수는 입력만을 기반으로 출력을 생성하며, 어떤 부작용도 발생시키지 않는 함수입니다. 이로 인해 코드의 예측 가능성과 재사용성이 높아지며, 병렬 처리와 같은 복잡한 연산에서도 안정성을 유지할 수 있습니다.

728x90