레퍼런스 투명성
레퍼런스 투명성(Referential Transparency)이란, 함수의 결과가 함수의 인자에만 의존하며, 함수 호출 시점에 따라 결과가 달라지지 않는 특성을 말합니다. 다시 말해, 같은 인자에 대해 항상 같은 결과를 반환하는 함수를 의미합니다.
예를 들어, 다음과 같은 함수가 있다고 가정해봅시다.
function square(x) {
return x * x;
}
JavaScript
복사
이 함수는 레퍼런스 투명성을 가지고 있습니다. 함수의 결과는 함수의 인자 x에만 의존하며, 인자 x의 값이 동일하다면 항상 같은 결과를 반환합니다. 즉, square(2)를 호출하면 항상 4를 반환합니다.
반면에, 다음과 같은 함수는 레퍼런스 투명성을 가지지 않습니다.
function getRandomNumber() {
return Math.random();
}
JavaScript
복사
이 함수는 호출 시점에 따라 결과가 달라질 수 있습니다. 즉, getRandomNumber()를 호출할 때마다 다른 값을 반환합니다. 따라서 이 함수는 레퍼런스 투명성을 가지지 않습니다.
레퍼런스 투명성의 장점
레퍼런스 투명성은 함수형 프로그래밍에서 매우 중요한 개념입니다. 레퍼런스 투명한 함수는 다음과 같은 장점을 가지고 있습니다.
1. 테스트 용이성
레퍼런스 투명한 함수는 항상 같은 결과를 반환하기 때문에, 테스트하기가 매우 쉽습니다. 같은 인자에 대해 항상 같은 결과를 반환하므로, 함수의 테스트를 쉽게 할 수 있습니다.
2. 코드 가독성
레퍼런스 투명한 함수는 코드의 가독성을 높일 수 있습니다. 함수의 결과가 함수의 인자에만 의존한다면, 코드의 동작을 이해하기 쉽습니다. 또한, 함수의 인자와 반환 값 사이의 관계가 명확해지므로, 코드의 의도가 더욱 분명해집니다.
3. 모듈화
레퍼런스 투명한 함수는 모듈화된 코드를 작성하는 데 매우 유용합니다. 함수의 결과가 함수의 인자에만 의존하므로, 다른 함수와의 결합도가 낮아집니다. 이는 함수를 작게 분해하고 재사용성을 높이는 데 매우 유용합니다.
레퍼런스 투명성의 단점
레퍼런스 투명한 함수는 인자에만 의존하기 때문에, 외부의 상태나 부작용을 고려하지 않습니다. 이는 함수가 외부 자원을 변경할 수 없다는 것을 의미합니다. 따라서, 파일 시스템이나 네트워크 같은 외부 자원을 다룰 때에는 레퍼런스 투명성을 유지하기 어렵습니다. 이러한 경우에는 함수의 결과가 예측 가능하지 않기 때문에, 함수의 테스트와 디버깅이 어렵습니다.
예를 들어, 다음과 같은 함수가 있다고 가정해봅시다.
function appendToFile(filename, data) {
// 파일에 데이터를 추가하는 로직
}
JavaScript
복사
이 함수는 외부 자원인 파일 시스템을 변경할 수 있습니다. 즉, 함수 호출 후에는 파일 시스템의 상태가 변경됩니다. 따라서, 이 함수는 레퍼런스 투명성을 유지하기 어렵습니다. 이 함수를 테스트할 때에는 파일 시스템의 상태를 고려해야 하며, 이는 테스트와 디버깅을 어렵게 만듭니다.
결론
레퍼런스 투명성은 함수형 프로그래밍에서 매우 중요한 개념입니다. 레퍼런스 투명한 함수는 테스트하기 쉽고, 코드의 가독성을 높일 수 있으며, 모듈화된 코드를 작성하는 데 유용합니다. 하지만, 외부 자원을 다룰 때에는 레퍼런스 투명성을 유지하기 어렵습니다. 따라서, 레퍼런스 투명한 함수를 작성할 때에는 인자에만 의존하도록 주의해야 합니다.