그래서?
이제 함수의 세 가지 측면, 즉 서브루틴, 값을 반환하는 서브루틴, 순수한 함수라는 측면을 살펴봤으니 잠시 멈추고, 이렇게 구분하는 것에 어떤 의미가 있는지 생각해 봐야 합니다.
필자가 이 장을 쓰면서 의도한 것은 자바스크립트의 문법을 설명하는 것이 아니라 독자 여러분이 왜? 라는 의문을 갖게 하려는 것입니다. 왜 함수를 사용할까요? 함수를 서브루틴이라는 관점에서 보면 그 의문에 대한 한 가지 답을 얻습니다. 반복을 없애는 거죠. 서브루틴을 쓰면 자주 사용하는 동작을 하나로 묶을 수 있다는 매우 분명한 장점이 있습니다.
NOTE 코드를 하나로 묶어서 반복을 피한다는 개념은 너무나 중요해서, DRY(don’t repeat yourself)라는 약어가 새로 생겼을 정도입니다. 문법적으로 정확한 표현은 아닐 수 있지만, 간혹 사람들이 코드에 대해 얘기하면서 그런 표현을 쓰는걸 볼 수 있습니다. 누군가 당신의 코드를 보고 “This code here could be more DRY.” 라고 얘기한다면, 그건 당신의 코드에 불필요하게 반복되는 부분이 있다는 뜻입니다.
순수한 함수는 조금 더 복잡한 문제이며, 왜? 라는 의문에 대한 답도 더 추상적인 형태입니다. “그렇게 하면 프로그램이 좀 더 수학과 비슷해지니까”라고 대답할 수도 있겠지만, 그렇게 대답하면 “프로그램이 수학과 비슷해지면 뭐가 좋은데?” 라는 반문이 따라올 겁니다. “순수한 함수를 쓰면 코드를 테스트하기 쉽고, 이해하기 쉽고, 재사용하기도 더 쉬우니까” 처럼 대답하는 편이 좋습니다.
함수가 상황에 따라 다른 값을 반환하거나 부작용이 있다면 그 함수는 컨텍스트에 좌우되는 함수입니다. 어떤 함수가 정말 유용하더라도 부수 효과가 있다면, 그리고 그 함수가 쓰이던 프로그램이 아닌 프로그램에서 사용하려 한다면 문제를 일으킬 수 있습니다. 99%는 제대로 동작하다가 1%의 상황에서 버그를 일으키는 상황은 더 심각합니다. 프로그래머라면 누구나 깨닫고 있겠지만, 가장 악질적인 버그는 숨어 있는 버그입니다. 이런 버그는 오랫동안 발견되지 않기 때문에, 문제가 있다는 걸 알게 되더라도 찾기가 정말 어렵습니다.
필자가 순수한 함수를 권장하는 건지 궁금하다면, 답은 그렇다 입니다. 항상 순수한 함수를 쓰는 습관을 들이는 편이 좋습니다. ‘습관’이라고 한건, 가끔은 함수에 부수 효과가 있더라도 그냥 쓰는 편이 훨씬 쉬울 때가 있기 때문입니다. 초보 프로그래머라면 그런 때가 더 많을 겁니다. 그러지 말라는 건 아닙니다. 단지, 잠시 멈추고 순수한 함수를 사용하는 방법이 있는지 생각해 보라는 말입니다. 시간이 흐르면, 자연스럽게 순수한 함수를 더 많이 쓰게 될 겁니다.
9장에서 설명한 객체지향 프로그래밍은 스코프를 밀접하게 관리해서 함수의 부수 효과를 제어할 수 있습니다.