더 큰 그림

11hertz·2024년 3월 3일

YDKJSY

목록 보기
4/9
post-thumbnail

4.1 첫 번째 기둥 : 스코프와 클로저

함수나 블록 단위로 변수의 스코프(유효 범위)를 한정 짓는 것은 모든 프로그래밍 언어의 근본적인 특징
스코프는 양동이, 변수는 양동이에 넣을 구슬에 비유할 수 있으며, 언어 고유의 스코프 모델은 구슬과 같은 색을 가진 양동이를 찾도록 도와주는 규칙
스코프 안에는 다른 스코프가 올 수 있으며, 스코프가 중첩될 때 표현식(expression)이나 문(statement)은 해당 레벨의 스코프 혹은 더 높거나 바깥 레벨에 있는 변수에만 접근할 수 있고, 낮거나 안쪽 레벨 스코프에 있는 숨겨진 변수에는 접근할 수 없음
대부분의 프로그래밍 언어는 이런 작동 방식을 취하며, 이를 렉시컬 스코프(lexical scope)라고 부름
스코프의 기준가 그 경계, 경계 안에서 변수가 어떻게 구성되는지는 프로그램을 파싱(또는 컴파일)할 때 결정

JS는 렉시컬 스코프 모델을 채택하고 있긴 하지만, 같은 모델을 사용하는 언어들과는 다른 두 가지 특징을 가짐

1) 호이스팅(hoisting)
특정 스코프 내에 선언한 변수가 선언된 위치와 상관없이 해당 스코프 시작 부분에서 선언한 것마냥(끌어올려진 것처럼) 처리되는 것

2) var를 사용해 선언한 변수는 해당 변수를 선언한 블록 위치와 상관 없이 함수 기준으로 스코프가 만들어지는 것

클로저(closure)는 JS 같이 함수를 일급값(first-class value)으로 취급하는 언어에서 렉시컬 스코프 모델을 사용하면 자연스레 나타나는 결과
바깥 스코프에 있는 변수를 참조하는 함수가 있고, 이 함수가 변수를 통해 별개의 스코프에서 실행될 때, 함수는 함수가 정의된 스코프를 기준으로 변수를 참조하는 것을 클로저라고 함

4.2 두 번째 기둥 : 프로토타입

JS는 클래스를 통해 사전에 구조를 정의하지 않아도 직접적이고 명시적으로 객체를 만들 수 있는 몇 안되는 언어 중 하나
프로토타입을 사용하면 this 컨텍스트가 공유되면서 두 객체를 아주 간편하게 연결할 수 있고, 함수가 메서드가 실행되는 동안 두 객체를 동적으로 협력하게 만들 수 있음
클래스는 프로토타입이 가진 강력한 힘을 기반으로 하는 하나의 패턴
객체는 객체로서 그대로 두고, 클래스 없이 프로토타입 체인을 통해 객체가 협력하도록 하는 방식의 접근법도 있는데 이를 작동 위임(behavior delegation)이라 함

4.3 세 번째 기둥 : 타입과 타입 강제 변환

개발자 상당수는 프로그래밍 언어에서, 특히 JS에서 타입이 어떻게 작동하는지 잘 모르는 채로 개발함
JS 커뮤니티 구성원 대부분의 관심사가 타입 기반의 타입스크립트나 플로(Flow)같은 도구를 사용하는 정적 타입(static type) 방식 개발로 쏠리는 추세
JS 개발자가 타입에 관해 더 많이 학습하고 JS에서 타입 변환이 어떻게 이루어지는지 반드시 배워야 함
타입 관련 기초 지식이 갖춰진 후에 타입 기반 도구를 사용하면 개발 생산성이 올라갈 수 있음

그러나 똑똑하고 명확하게 타입을 설정하기 위해 꼭 정적 타입이 필요한 것은 아님
JS의 본질을 따른다면 정적 타입 도구 없이도 목표한 바를 달성할 수 있음
어떤 JS 관련 프로그램이나 도구도 JS에서 값의 타입을 다루는 방식과 타입 강제 변환 메커니즘을 응용하지 않았더라면 제 기능을 다하지 못했을 것이며, JS에서 어떻게 타입을 관리하는지 깊숙이 이해하지 못한다면 타입스크립트나 플로 같은 정적 타입 도구를 사용해서 문제를 해결하는 방식을 최대로 활용할 수 없음

4.4 JS의 본질 따르기

JS 고유의 방식을 배우고 습득하는 것이 최우선이며, 이후에 실제 작업 중인 프로그램을 JS다우면서도 실용적으로 만들 것
JS에는 JS라고 인식될 만한 수많은 패턴과 관용구가 존재하고, 이런 패턴과 관용구를 따르는 것이 최선

작업 중인 프로젝트 개발 방식과 동료들이 일하는 방식을 따를 것
하루아침에 기존 프로젝트를 다 뒤엎겠다는 생각은 무조건 실패하는 방식
개선할 점이 보인다면 장기간에 걸쳐 조금씩 바꿔나가야 함
기존 방식을 다시 살펴보고 재고하는 것이 왜 중요한지 동료 개발자들과 이야기하며 공감대를 형성해야 함
한 번에 한 가지 작은 주제로 토론하고, 개선 전과 후 코드 차이가 토론의 주인공이 되도록 해야 함
팀 구성원 모두가 모여 함께 코드를 분석하고 토론하며 근거를 기준으로 결정을 내려야 함

JS를 학습할 때는 가독성 향상에 도움을 주는 방식이 있는지 항상 탐구해야 하며, 이러한 방식을 탐구하다보면 미래의 자신과 같이 작업하게 될 사람들이 감사 인사를 저절로 받게 될 수 있음

profile
Practice Makes Perfect!

0개의 댓글