레퍼렌셜 트랜스페런시(참조 투명성)란 컴퓨터 프로그램의 특성 중 하나로, 어떠한 표현식이 프로그램의 행동에 영향 없이 직접적인 값으로 대체 가능한 것을 말한다. 그렇기 위해서는 한 눈에 보이는 연산 이외에는 사이드 이펙트를 가지지 말아야한다.
특정 입력에 대해서 반드시 동일한 결과를 보장하는 수학적 함수(또는 순수 함수)를 생각해볼 수 있다. 사이드 이펙트가 없기 때문에 가독성이 좋고, 리팩토링이 용이하며 컴파일러가 최적화를 하기에도 쉽다.
사인 값을 구하는 함수 sin()
을 사용한 x = sin(x)
은 투명하다. x 값은 항상 같다. 오늘 날짜를 반환하는 함수 today()
를 사용한 date = today()
는 불투명하다. 오늘 날짜에 따라 date
의 값은 변화한다.
위에서 말한 것처럼 직접적인 값으로 모든 피연산자가 대체 가능하면 참조 투명하다.
int add(int a, int b) {
return a + b;
}
// 아래는 모두 참조 투명하다
int ten1 = 5 + 5;
int ten2 = 5 + add(2, 3);
int ten3 = add(2,3) + add(1, 4);
단순히 반환하는 결과 값이 같다고 참조가 투명한 것도 아니다. 사이드 이펙트가 있는 아래 예시를 생각할 수 있다.
// 글로벌 변수
int g = 0;
// 참조 투명한 함수
int rt(int x) {
return x + 1;
}
// 참조 불투명한 함수
int ro(int x) {
g++;
return x + 1;
}