더북(TheBook)

1.1.2 참조 투명성으로 프로그램을 더 안전하게 만들기

부수 효과를 없애는 것(외부 세계를 변경하지 않는 것)만으로는 프로그램을 충분히 안전하고 결정적으로 만들 수 없다. 프로그램을 충분히 안전하고 결정적으로 만들려면 외부 세계로부터 영향을 받아서도 안 된다. 즉, 프로그램의 출력은 오직 그 인자에 의해서만 영향을 받아야 한다. 이는 프로그램이 데이터를 콘솔, 파일, 원격 URL, 데이터베이스에서 읽을 수 없음은 물론이고, 심지어 시스템의 데이터를 받을 수도 없다는 뜻이다.

외부 세계의 상태를 변경하지도 않고 외부 상태에 의존하지도 않는 코드를 일컬어 참조 투명(referentially transparent)하다고 한다. 참조 투명한 코드에는 몇 가지 흥미로운 특성이 있다.

참조 투명한 코드는 자기 완결적이다. 어떤 문맥에서나 그 코드를 사용할 수 있다. 단지 올바른 인자를 그 코드에 제공하기만 하면 된다.

참조 투명한 코드는 결정적이다. 참조 투명한 코드는 인자가 같으면 항상 결과도 같기 때문에 여러분을 놀라게 하는 일이 없다. 하지만 참조 투명한 코드도 잘못된 결괏값을 돌려줄 수는 있다. 그렇지만 적어도 같은 인자에 대해 항상 같은 결과를 보장한다.

참조 투명한 코드는 절대 예외를 던지지 않는다. 다만 참조 투명한 코드도 메모리 부족 오류(OOME, Out Of Memory Error)나 스택 오버플로 오류(SOE, Stack Overflow Error)를 발생시킬 수는 있다. 하지만 이런 오류는 프로그램에 버그가 있음을 뜻한다. 메모리 부족이나 스택 오버플로 등은 프로그래머인 여러분이나 여러분이 제공하는 API를 사용하는 쪽에서 처리할 수 있는 오류 상황이 아니다(이런 오류가 발생할 때 취할 수 있는 방법은 애플리케이션을 중단하고 버그를 수정하는 것뿐이다).

참조 투명한 코드는 예기치 않게 다른 코드가 실패하는 상황을 만들지 않는다. 참조 투명한 코드는 인자를 변경하거나 다른 외부 데이터를 변경하지 않으며, 그에 따라 코드를 호출하는 쪽의 데이터가 오염되거나 동시 접근으로 인해 오류가 발생하는 경우가 없다.

참조 투명한 코드는 자신이 제대로 작동하기 위해 외부 장치에 의존하지 않는다. 참조 투명한 코드는 외부 장치(예를 들어 데이터베이스, 파일 시스템, 네트워크)를 사용할 수 없거나, 외부 장치가 너무 느리거나 고장 나서 코드가 계속 대기 상태에 머무는 경우가 없다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.