Sleeep23' space
Front-end Engineer

자바스크립트로 배우는 SICP - 18. 함수와 바인딩

배정은 함수를 평가하는 방식이 다르다고..?

2023-11-11 | 독서 | 6min


오늘은 앞서 다뤘던 배정에 이어 배정 연산이 있는 함수의 평가에 대해서 다룬다!

배정을 사용하지 않는 경우, 같은 함수를 같은 인수들로 여러 번 호출해도 항상 같은 결과가 나오게 된다. 그냥 수학에서 정의하는 함수의 느낌이다. 이렇게 배정을 이용하지 않는 경우를 함수형 프로그래밍 이라고 부른다.

배정을 사용하는 경우, 함수를 평가할 때 치환모형을 사용한다면 시변 상태를 구분하기 어려워진다. 구체적으로 보면, 배정 연산을 통해 상태를 변화시킨 경우 함수 내에서 상태가 변하는데 치환모형은 변한 상태 또한 인수를 평가하는 과정에서 동일한 값으로 평가될 것이기 때문이다.(참고로 이런 임의의 표현식에서 하나를 다른 하나로 치환해도 그 표현식의 평가 결과가 달라지지 않아야 한다는 개념을 가리켜 참조 투명성 이라고 한다.)

배정을 적극적으로 사용하는 프로그래밍 스타일을 명령식 프로그래밍 이라고 부른다.

배정 때문에 값이 변하는 변수의 경우, 이전처럼 값으로 생각하면 안되고 값을 담을 수 있는 저장소로 생각을 바꾸어야 한다. 같은 함수를 호출해도 다른 변수에 할당하면, 다른 저장소 / 별개의 객체로 인식된다는 것이다.

아래의 코드를 보자.

function square() {
	return x * x
}

이 코드는 아래처럼 평가된다.

https://sicp.sourceacademy.org/img_javascript/ch3-Z-G-3.svg

우선 함수의 매개변수에 대한 환경이 구성된다. 그리고 해당 매개변수와 함수의 이름(즉, 변수 / 저장소 / 프레임)과 바인딩되어 있다.

그럼 인수와 함께 호출될 경우 어떻게 적용될까?

square(5)

위 코드는 아래와 같이 평가된다.

https://sicp.sourceacademy.org/img_javascript/ch3-Z-G-4.svg

함수를 인수에 적용할 때, 함수의 매개변수들을 인수 값에 묶는 프레임 하나를 담은 환경이 새로이 만들어진다.