2장 참조 투명성, 순수성, 그리고 치환 모형

함수형 프로그래밍에 대해서 더 깊이 있게 탐색하고자 할 때 꼭 필요한 수학적 지식과 용어들이 있다. 이번 장에서는 이러한 것들에 대해 차근차근 설명해 보려고 한다. 또한 지루함을 달래기 위해 간단한 예제들도 함께 할 것이다.

2.1 함수

우리가 보통 프로그램을 배우면서 처음 배우는 함수는 아래와 같다.

코드2.1 프로그래밍에서 사용하는 함수
public static void main(String[] args){
    System.out.println( "Hello world");
}

우리가 앞으로 마음속에 품어야 할 것은 이런 함수가 아니라 바로 수학(mathematics)에서의 함수이다. 수학적 의미의 함수는 "첫 번째 집합의 임의의 한 원소를 두 번째 집합의 오직 한 원소에 대응시키는 대응 관계이다."이다.

그림2.1 함수 기호, X는 정의역 Y는 공역, f(x)의 함수를 사상하였을 때 나오는 결과의 집합을 치역(; D, C)이라 한다.

image

두 개의 차이는 무엇일까? 바로 "부수 효과(side effect)"의 존재 여부이다. 함수형 프로그래밍(functional programming)에서는 부수효과가 없는 수학적 용어의 함수로 프로그래밍을 하는 것이다. 이러한 함수들을 가리켜 "순수함수(pure function)"라 한다.

순수 함수들로 프로그램을 작성하면 얻을 수 있는 장점은 모듈성(modularity)가 증가하는 것이다. 모듈성 덕분에 순수 함수는 테스트, 재사용, 병렬화, 분석이 더 쉽다. 때문에 순수 함수로 프로그래밍을 작성하게 되면 버그가 생길 여지도 훨씬 적어진다.

2.2 부수효과

앞선 절에서 함수를 설명하면서 순수 함수라는 것이 "부수효과"가 없는 것이라고 설명했다. 그렇다면 자주 접하던 그 부수효과란 과연 무엇일까? 우리가 공부했던 함수형 프로그래밍 책에서는 아래와 같이 7개의 예를 들어주고 있다.

  • 변수를 수정한다.
  • 데이터 구조를 변경한다.
  • 객체의 필드를 설정한다.
  • 예외(exception)를 던지거나 오류를 내면서 실행을 중단한다.
  • 콘솔에 출력하거나 사용자의 입력을 읽어들인다.
  • 파일에 기록하거나 파일에서 읽어들인다.
  • 화면에 그린다.

변수를 수정하거나 예외를 던지는 것, 파일에 기록하거나 읽어드리는 것이 없이 프로그램을 작성한다는 것에 대해서 상상해본적이 있는가? 아마도 없거나 절대 불가능하다고 생각할지도 모르겠다. 다행하게도 부수효과를 제거하여 프로그래밍을 작성하는 것이 가능하며 이렇게 작업하는 방법을 배우고나면 앞으로 훨씬 행복해질 수 있다.

2.3 참조 투명성

이제 참조 투명성(referential transparency)에 대해서 살펴보자. 우선 간단하게 더하기 함수에 대해서 살펴보자.

코드 2.2 더하기 함수
def sum(a: Int, B: Int): Int = {
  a + b
}

더하기 함수는 정수 값 두개를 받아서 값을 더한 값을 반환한다. 주어진 임의의 두 정수에 대해 이 함수는 항상 같은 값을 돌려준다.

예를 들어 2와 3 숫자를 위의 sum 함수를 사용해서 결과를 낸다고 생각해보자. 그렇다면 우리가 수학에서 생각했던 2 + 3 = 5라는 공식을 머리속에 그려낼 수 있고 이는 입력 값 2, 3에 대해 결과 값 5가 나오는 동작만 수행할 뿐 다른 일을 하지 않는다.

순수 함수의 이러한 개념을 바로 참조 투명성이라 한다. 아래는 우리가 공부한 책에서 밝히고 있는 참조 투명성과 순수성의 정의이다.

모든 프로그램 p에 대해 표현식 e의 모든 출현을 e의 평가로 치환해도 p의 의미에 아무 영향이 미치지 않는다면, 그 표현식 e는 참조에 투명하다. 만일 표현식 f(x)가 참조에 투명한 모든 x에 대해 참조에 투명하면, 함수 f는 순수하다

2.4 치환 모델

어떤 함수가 참조 투명하다고 표현할 수 있는 것은 위의 절에서 언급한 것처럼 모든 입력에 대해서 그 결과 값이 항상 동일할 때를 말한다. 프로그래밍에서 함수가 이러한 사항을 충실히 이행하면 치환 모델(substitution model)이라고 부르는 추론 모형이 가능해진다. 참조 투명성은 프로그램에 대한 등식적 추론을 가능하게 하는데 이를 활용하면 프로그램에서 함수를 적극적으로 재활용할 수 있는 길이 열리는 것이다.

2.5 정리

이번 장에서는 함수형 프로그래밍에서 이야기하는 몇 가지 용어에 대해서 살펴보았다. 여기서 몇 가지 언급하지 않은 것이 있는데 그것은 다음 장에서 필요할 때 언급할 것이다. 이번 장에서 꼭 기억할 것은 바로 "부수 효과"의 정의이다. 부수효과는 변수 수정, 데이터 구조 변경, 예외를 던지는 것 등이다. 그리고 이런 부수효과를 제거하면 함수형 프로그래밍에서 꼭 언급되는 참조투명성과 만나게 된다. 다음은 모노이드에 대해서 살펴볼 차례이다.

results matching ""

    No results matching ""