참조 투명성

fun(a)를 두 번 부르는 것과, 한 번 불러 두 번 쓰는 것은 같을까?

두 가지 코드

두 번 부르기, 한 번 부르기

위는 fun(a)를 두 번 부릅니다. 아래는 한 번만 불러 temp에 담아 두고, 그 temp를 두 번 씁니다. result1과 result2는 같을까요?

교재의 예입니다. /는 나누기입니다.

부작용이 없으면

두 답은 같습니다

fun에 부작용이 없으면 몇 번을 불러도 같은 값을 돌려줍니다. 그래서 fun(a)를 temp로 바꿔 써도 결과가 같습니다.

fun(a)가 10, b가 2, c가 4라는 값은 예시입니다.

부작용이 있으면

두 답이 달라집니다

fun이 부를 때마다 다른 값을 돌려주면 달라집니다. 두 번 부른 쪽은 1, 한 번 부른 쪽은 2입니다. 같은 뜻으로 보이던 두 코드가 다른 답을 냅니다.

처음에 10, 다음에 16을 돌려준다는 것은 예시입니다. 밖의 변수를 바꾸는 함수는 이렇게 될 수 있습니다.

참조 투명성

값이 같으면 바꿔 써도 됩니다

값이 같은 두 식을 프로그램 어디에서 서로 바꿔 써도 동작이 변하지 않는 성질이 참조 투명성(referential transparency)입니다. 이 성질이 있으면 같은 식은 늘 같은 값이라, 프로그램의 뜻을 읽고 예측하기 쉽습니다.

순수 함수형 언어

변수가 없으면 깨질 일도 없습니다

순수 함수형 언어(pure functional language)에는 변수가 없습니다. 함수가 밖에 값을 담아 둘 곳이 없으니 결과는 매개변수(함수가 값을 넘겨받는 변수)로만 정해집니다. 그래서 참조 투명성이 지켜집니다.

숫자는 예시입니다. 명령형 언어는 1강에서 본, 변수를 바꿔 가며 실행하는 언어입니다. 함수형 언어인 ML은 val로 이름에 값을 묶을 뿐, 묶은 값을 바꾸지 못합니다.

다음 편

순서 말고도 식을 헷갈리게 하는 것이 있습니다. 기호 하나에 뜻이 여럿인 경우입니다

5편기호 하나에 뜻이 여럿이면? 6강 목록