티스토리 뷰

반응형

참조 투명성

수학과 프로그래밍에서 모두 '함수'라는 말을 사용하고, 유사한 개념으로 사용됩니다. 하지만 둘의 결정적으로 다른 점이 있습니다. 수학에서의 함수는 같은 입력값이면 계산 된 결과는 항상 같습니다. 예를들어 f(x) = x*2 라는 함수가 있을 때, 같은 x 값을 넣게 되면 반환되는 f(x) 값은 항상 같습니다. 하지만 프로그래밍에서는 항상 같지 않습니다.

int count = 0;
int count(){
    return count++;
}

위와 같은 함수 count의 경우 매번 반환되는 값이 다르게 됩니다.

final int x = 10;
int getX(){
    return x;
}

반면 위와 같은 함수는 항상 같은 x의 값을 반환하게 됩니다. 이러한 경우를 '참조 투명'하다 라고 합니다. 앞서서 설명한 수학에서의 함수는 모두 참조 투명성을 갖고 있습니다. 그리고 이러한 함수를 참조 투명 함수 라고 부릅니다.

언제 사용할까?

  1. 알고리즘 문제를 해결 하기 위하여 동적계획법(Dynamic programming) 기법 중 '메모이제이션' 구현 패턴이 있습니다. 메모이제이션을 구현하기 위해서는 함수가 참조적 투명 함수 이여야 합니다.
  2. 함수형 프로그래밍에서 사용하는 함수도 참조 투명 함수만을 사용해야합니다.

반환값이 객체인 경우의 참조 투명성

매번 같은 객체를 반환하지만, 이 반환된 객체의 참조가 다른 경우는 참조 투명하다고 볼 수 있을까요? 자바8 인액션에서는 아래와 같이 설명하고 있습니다.

일반적으로 함수형 프로그래밍에서는 데이터가 변경되지 않으므로 같다는 의미는 (== 레퍼터런스(참조)가 같음)이 아니라 구조적인 값이 같다는 것을 의미한다. 따라서 함수형 프로그래밍의 관점에서 참조 투명성을 갖는다고 말할 수 있다. (자바8 인 액션 중)


참고도서 

알고리즘 문제 해결 전략 (저자 구종만)

자바8 인액션 (저자 라울-게이브리얼 우르마, 마리오 푸스코 외 1명)


반응형
댓글