Sleeep23' space
Front-end Engineer

자바스크립트로 배우는 SICP - 3. 은밀하고 위대한 함수

조건부 표현식과 블랙박스로서의 함수에 대해서 알아보자!

2023-10-25 | 독서 | 3min


키워드들

이번에 읽은 부분의 키워드들을 선정하자면 다음과 같다.

  • 조건부 표현식 - 삼항연산자와 &&, ||, !
  • 선언적 지식과 명령적 지식 - 수학 vs 컴퓨터
  • 블랙박스 함수와 지역 변수
  • 내부선언과 블록구조

참고로, 글을 자세하게 쓰려다가 사실 글의 목적이 지식을 전달하기 위한 목적보다는 나의 생각을 정리하는 것이기에 자세한 설명은 모두 제외하려고 한다.

간단한 요약

  1. 조건부 표현식은 술어의 값의 truthy, falsy 여부를 검사하여 true 인지 false 인지 확인한다. 삼항 연산자의 경우 술어를 평가한 뒤 참, 거짓 여부에 따라 귀결 표현식을 평가할지, 대안 표현식을 평가할 지에 대한 여부가 결정된다.
  2. 수학과 컴퓨터를 비교하자면, 수학은 사물의 성질을 서술한다. 이것은 무엇인가? 에 대한 서술이 이루어진다고 한다면, 컴퓨터에서는 명령적 서술 즉, 무언가를 하는 방법을 서술한다.

그런데 내가 알기론 최근에 LEAN 이라는 프로그래밍 언어가 있다고 들었다. 이는, 수학적 증명을 프로그래밍을 통해서 진행하는 데, 그럼 해당 언어는 명령적 서술과 동시에 선언적 서술의 특징을 지닌다는 것인가? 수학계의 레전드 테렌스 타오도 이 언어를 사용한 경험을 공유했다는 것을 보면 참 개발의 세계는 신기하다. 아래는 관련 트윗이다.

https://twitter.com/leanprover/status/1715450877551825051

  1. 복잡한 기능을 수행하는 함수의 경우, 다수의 부분문제를 해결하는 함수들의 조합으로 이루어져 있다. 이러한 분해 전략은 문제를 나눌 뿐만 아니라 부분문제를 해결하기 위한 함수들은 각각 모듈로 사용할 수 있어 다른 함수에도 이용할 수 있는 이점이 있다.

이렇게 만들어진 함수는 하나의 블랙박스로서 역할을 한다. 즉, 자신의 견과를 어떻게 계산하는지가 중요하지 않다. 중요한 것은 계산한다는 사실 이다. 그리고 이처럼 함수는 세부사항을 숨길 수 있어야 한다. 함수의 작성자만이 해당 함수를 이용하는 것이 아니기 때문이다. 함수를 이용하는 타인은 일종의 블랙박스처럼 함수를 이용하기 때문이다.

확실히 위 내용은 협업에서 중요하다고 생각한다. 개발에 참여하는 모두가 구현의 세부사항까지 알기에는 상당히 시간과 노력을 요구한다. 제대로 작성된 블랙박스로의 추상화된 함수는 반복작업을 없애고 각자의 영역에 더욱 시간을 쏟을 수 있기에 매우 효과적이라고 생각한다.

아무래도 나는 프론트엔드가 주 영역이라 추상화는 대부분 컴포넌트 작성이나 커스텀 훅, 데이터 페칭 로직 측면에서 자주 경험해왔었다. 이와 관련해서 좋은 리소스를 공유하자면, 아래의 영상을 참고하기를 바란다!

https://www.youtube.com/watch?v=fR8tsJ2r7Eg

  1. 우리는 함수를 작성하며 매개변수는 함수에 독립적인 (지역적인) 요소로서 작용한다는 격리(isolation)의 개념을 알고 사용한다. 함수 명과 매개변수 다음에 오는 중괄호 쌍은 하나의 블록을 구성하게 된다. 동시에 매개변수는 함수의 이름에 바인딩된다고 볼 수 있다. 이 방식을 활용하여 중첩된 함수의 선언도 가능하다. 이때 외부 블록의 매개변수는 내부 블록에서도 사용 가능하다. (주어진 인수가 된다.) 이것이 바로 lexical scoping (어휘순 범위 적용) 을 의미한다.

참고로 “어휘순” 의 의미는 컴파일러가 어휘분석 과정을 통해 토큰을 인식하는 순서이다. 이는 정적인 분석 과정에서 도출되는 순서이기에 정적 범위라고 불리기도 한다.

어휘적 환경은 자바스크립트 뿐만 아니라 타 언어에서도 매우 중요한 지식이라고 생각한다. 특히 프론트엔드 영역에서의 리액트의 경우 “리렌더링”이라는 개념이 등장하기에 같은 이름의 함수더라도 리렌더링 이전의 함수와 이후의 함수는 다른 어휘적 환경을 조성하기에 리소스의 활용이 불필요하게 중복되는 경우들이 존재한다. 이러한 부분들을 인지하고 줄여나갈 수 있는 능력이야 말로 능숙한 개발자의 역량이 아닐까 싶다.