LHJ

I'm a FE developer.

13.4 그래서?

19 May 2020 » js_lj

13.4 그래서?

이제 함수의 세 가지 측면, 즉

  • 서브루틴
  • 값을 반환하는 서브루틴
  • 순수한 함수

라는 측면을 살펴봤으니 잠시 멈추고, 이렇게 구분하는 것에 어떤 의미가 있는지 생각해 봐야 합니다.

필자가 이 장을 쓰면서 의도한 것은 자바스크립트의 문법을 설명하는 것이 아니라 독자 여러분이 왜? 라는 의문을 갖게 하려는 것입니다.
왜 함수를 사용할까요?
함수를 서브루틴이라는 관점에서 보면 그 의문에 대한 한 가지 답을 얻습니다.
반복을 없애는 거죠.
서브루틴을 쓰면 자주 사용하는 동작을 하나로 묶을 수 있다는 매우 분명한 장점이 있습니다.

NOTE_
코드를 하나로 묶어서 반복을 피한다는 개념은 너무나 중요해서, DRY(don’t repeat yourself)라는 약어가 새로 생겼을 정도입니다.
문법적으로 정확한 표현은 아닐 수 있지만, 간혹 사람들이 코드에 대해 얘기하면서 그런 표현을 쓰는걸 볼 수 있습니다.
누군가가 당신의 코드를 보고 “This code here could be more DRY.” 라고 얘기한다면, 그건 당신의 코드에 불필요하게 반복되는 부분이 있다는 뜻입니다.

순수한 함수는 조금 더 복잡한 문제이며, 왜? 라는 의문에 대한 답도 더 추상적인 형태입니다.
“그렇게 하면 프로그램이 좀 더 수학과 비슷해지니까” 라고 대답할 수도 있겠지만, 그렇게 대답하면 “프로그램이 수학과 비슷해지면 뭐가 좋은데?”라는 반문이 따라올 겁니다.
“순수한 함수를 쓰면 코드를 테스트하기 쉽고, 이해하기 쉽고, 재사용하기도 더 쉬우니까” 처럼 대답하는 편이 좋습니다.

함수가 상황에 따라 다른 값을 반환하거나 부작용이 있다면 그 함수는 컨텍스트에 좌우되는 함수입니다.
어떤 함수가 정말 유용하더라도 부수 효과가 있다면, 그리고 그 함수가 쓰이던 프로그램이 아닌 프로그램에서 사용하려 한다면 문제를 일으킬 수 있습니다.
99%는 제대로 동작하다가 1%의 상황에서 버그를 일으키는 상황은 더 심각합니다.
프로그래머라면 누구나 깨닫고 있겠지만, 가장 악질적인 버그는 숨어 있는 버그입니다.
이런 버그는 오랫동안 발견되지 않기 때문에, 문제가 있다는 걸 알게 되더라도 찾기가 정말 어렵습니다.

필자가 순수한 함수를 권장하는 건지 궁금하다면, 답은 그렇다 입니다.
항상 순수한 함수를 쓰는 습관을 들이는 편이 좋습니다.
‘습관’이라고 한 건, 가끔은 함수에 부수 효과가 있더라도 그냥 쓰는 편이 훨씬 쉬울 때가 있기 때문입니다.
초보 프로그래머라면 그런 때가 더 많을 겁니다.
그러지 말라는 건 아닙니다.
단지, 잠시 멈추고 순수한 함수를 사용하는 방법이 있는지 생각해 보라는 말입니다.
시간이 흐르면, 자연스럽게 순수한 함수를 더 많이 쓰게 될 겁니다.

9장에서 설명한 객체지향 프로그래밍은 스코프를 밀접하게 관리해서 함수의 부수 효과를 제어할 수 있습니다.