변수의 이름이란?
스코프는 왜 필요할까?
클로저란?
변수의 이름이 탄생하기 전에는, 변수의 값을 어떻게 가져왔을까? 해당 변수가 저장된 곳의 주소를 통해서 가져왔다. 예를 들어, 영어 사전이 필요할때, 누군가에게 책장 2 번째 열에 5번째 책을 가져다줘 라고 말하는 식이다. 이름 이 탄생하고 나서는 이런 불편이 해소되었다. 영어 사전을 가져다줘 라는 말은 책장 2 번째 열에 5번째 책을 가져다줘 라는 말로 자동으로 번역될 수 있게 되었다.
이때 필요한 것이 이름과 주소 사이에 대응 관계다. 영어 사전이라는 이름이 정의 되는 순간, 이름과 주소의 대응관계를 따로 저장해 두어야 한다. 이후, 이름이 다시 쓰일때, 해당 대응관계를 가져와서 쓸 수 있게 된다.
프로그램 규모가 커지면, 이름 충돌 문제가 발생한다. 이름이 중복될 수 없기 때문에, 유사한 개념인 경우에 이름을 길게 하는 등의 기법으로 중복을 피하게 된다. 이것이 너무 불편하기 때문에 스코프 가 탄생하게 되었다.
스코프 는 변수의 이름과 값 사이에 대응관계를 저장한 대응표가 특정한 영역마다 존재하는 것을 뜻한다.
자바스크립트에서 블록스코프와 함수 스코프를 구분하고 있고, 변수를 선언할때, 스코프를 다르게 지정하는 것이 가능한데, 이때 스코프가 바로 위에서 말한 스코프이다.
스코프 개념을 통해서 클로저도 쉽게 이해가 가능하다. 함수가 정의될때, 함수 스코프 안에서 대응관계가 없는 변수 (자유 변수) 가 쓰인 다면, 이 자유 변수에 대한 적절한 대응관계를 찾기 위해서, 상위 스코프를 찾아보게 된다. 이 과정을 (스코프 체이닝)이라고 한다.
이 때, 상위 스코프를 해당 함수의 환경이라고 생각할 수 있고, 스코프 체이닝이 일어난다면, 해당 함수는 자유변수에 환경에 대한 정보도 함께 가지고 있는 것이 된다. 이를 클로저라고 한다.
- 실행 컨텍스트
- 콜 스택
- lexical environment
실행되는 코드에 대한 환경 정보를 담고 있는 객체를 실행 컨텍스트라고 한다. 호출되는 함수에 따라서 해당 함수의 실행 컨텍스트가 콜스택에 쌓이게 된다.
실행컨텍스트에는 lexical environment 가 있다. 이곳에 변수와 값의 대응 관계를 저장한다. lexical enviornment 에는 environmentRecord 라는 부분이 있는데, 여기에 함수의 매개변수와 내부 함수, var 로 선언된 변수의 이름을 저장한다.
엔진은 현재 실행될 코드를 확인하면서, 우선 environmentRecord 에 어떤 변수가 있는지 찾아서 넣는데, 이 때문에 선언이 함수 스코프의 상단으로 끌어올려지는 호이스팅이 발생한다.
한주간 운동을 건너뛰었다가 하니 몸이 날아갈것 같다. 운동은 정말 선택이 아닌 필수인것 같다. 뽀모도로와 마찬가지로 효율성을 생각한다면, 적극적으로 추진해야할 습관인 것 같다.
요즘에는 계속 단위시간당 생산량에 신경쓰게 된다. 주구장창 할 때 보다 감정,체력, 전략 등 여러가지 신경쓰이는게 많아졌다. 일단, 내가 통제가능한 영역에 있는것은 전략이다.
어떤 일을 할때, 그 일에서 내가 추구하는 것은 무엇이고, 결과물의 형태는 어때야 하고, 나는 무엇을 가지고 있는지를 명확히 정의한 상태로 들어가는 것. 그리고 이 기준에 맞추어서 세부과제를 생성하고, 하나씩 해나가는 것. 마지막으로 결과를 평가하고 반성하는 것이다.
전략 세우기를 연습하는 방법은 역시 표현이다. 일을 수행할때, 그 일에 대한 메타(전략)을 함께 적도록 하자. 일과 함께 일의 메타를 함께 생각하는 방법은 실용주의 프로그래머에서도 읽은 기억이 있다.
나의 통제밖에 있는 것은 감정과 체력이다. 특히나 감정과 정신은 가다듬기가 쉽지 않은것 같다. 뽀모도로와 명상을 결합해서 수행해보자.