더북(TheBook)

이렇게 참조 투명한 식을 그 결괏값으로 치환해 프로그램을 계산하는 모델을 치환 모델(substitution model)이라고 한다. 이런 치환 모델을 함수에 적용하면 함수 호출을 그 반환 값으로 치환할 수 있다. 다음 코드를 살펴보자.

fun main(args: Array<String>) {
    val x = add(mult(2, 3), mult(4, 5))
    println(x)
}

fun add(a: Int, b: Int): Int {
    log(String.format("Returning ${a + b} as the result of $a + $b"))
    return a + b
}

fun mult(a: Int, b: Int) = a * b

fun log(m: String) {
    println(m)
}

여기서 mult(2, 3)mult(4, 5)를 각각의 반환 값으로 치환해도 프로그램 전체의 의미는 바뀌지 않는다. 이를 다음과 같이 볼 수 있다.

val x = add(6, 20)

반면에 add 함수 호출을 그 반환 값으로 바꾸면 더 이상 log를 호출하지 않아서 아무런 로그도 남지 않기 때문에 프로그램의 의미가 바뀐다. 이런 의미 차이가 중요할 수도 있고 중요하지 않을 수도 있지만, 어쨌든 프로그램의 결과는 달라진다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.