참조 투명(referential transparency)
함수형 프로그래밍에서의 참조 투명(referential transparency)이란, 동일한 입력 값에 대해 항상 동일한 결과를 반환하는 함수를 의미합니다. 즉, 어떤 함수의 결과가 그 함수의 인자에만 의존하고, 그 외의 외부적인 상태나 환경에 의존하지 않는 함수를 참조 투명 함수라고 합니다.
예를 들어, 다음과 같은 함수를 생각해봅시다
def add(x, y): return x + y
이 함수는 참조 투명합니다. 왜냐하면, 인자 x
와 y
에 따라 결과가 달라지지만, 같은 인자에 대해서는 항상 동일한 결과를 반환하기 때문입니다.
이것은 이 함수가 다른 상태나 환경에 영향을 받지 않고, 순수하게 입력 값에만 의존하기 때문입니다.
반면에, 다음과 같은 함수는 참조 투명하지 않습니다
def get_random_number(): return random.randint(1, 100)
이 함수는 실행할 때마다 결과가 달라지기 때문에 참조 투명하지 않습니다. 즉, 함수가 외부적인 상태나 환경에 의존하기 때문입니다.
참조 투명 함수는 예측 가능하고 테스트하기 쉽기 때문에, 함수형 프로그래밍에서는 이러한 함수를 선호합니다.
또한 참조 투명 함수를 조합하여 더 복잡한 함수를 만들 수 있으며, 이는 코드의 가독성과 유지보수성을 향상시키는 데 도움이 됩니다
함수형 언어는 참조 투명을 일반적으로 강제한다
참조 투명성은 입력값이 같으면 항상 같은 결과값이 나와야 하기 때문에, side effect가 없는 함수를 작성하여 참조 투명성을 보장합니다.
따라서 함수형 언어에서는 side effect를 일으키는 변수의 값을 변경하는 대입문, 입출력 등의 기능이 제한됩니다
예를 들어, Haskell은 변수를 변경하는 대입문을 제공하지 않으며, 입출력을 수행하는 함수는 모두 명시적으로 선언되어 있어야 합니다.
하지만 모든 함수형 언어에서 참조 투명성이 강제로 지켜지는 것은 아닙니다.
예를 들어, Clojure와 같은 몇몇 함수형 언어는 참조 투명성을 보장하지 않는 기능을 일부 제공합니다.
이 경우, 사용자가 직접 부작용을 관리해야 하므로, 프로그램이 올바르게 동작하도록 유의해야 합니다.
간단한 예시를 더 들자면, 전역 변수를 사용하지 않는 것도 그 예라고 할 수 있습니다.
전역 변수를 사용하지 않고, 상태를 유지 해야 한다면, 상태를 인자로 받아 함수를 호출하고 새로운 상태를 반환하는 방식으로 사용합니다.
이렇게 되면, 함수 호출 시점의상태에만 의존하므로, 예측 가능한 동작을 보장 할 수 있습니다.
결과적으로 전역 변수 없이도 함수형 프로그래밍 언어를 다룰 수 있습니다
'Computer Science > 프로그래밍 언어론' 카테고리의 다른 글
명령형 언어 (0) | 2023.03.26 |
---|---|
하이브리드 기법이란? (0) | 2023.03.26 |
해석 기법이란? (0) | 2023.03.26 |
컴파일(Compile) 기법은 무엇인가 (0) | 2023.03.26 |
꼬리 재귀(tail recursion) (0) | 2023.03.14 |